- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我学习过的大多数 Android OpenGL ES 教程都有这样的 onSurfaceChanged() 函数:
public void onSurfaceChanged( GL10 gl, int width, int height ) {
gl.glViewport( 0, 0, width, height );
gl.glMatrixMode( GL10.GL_PROJECTION );
gl.glLoadIdentity();
GLU.gluPerspective( gl, 45.0f, ( ( float )width / ( float )height ), 0.1f, 100.0f );
gl.glMatrixMode( GL10.GL_MODELVIEW );
gl.glLoadIdentity();
}
然而,这里的分组是什么?必须在 glViewport 之后调用 glMatrixMode() 吗?并且必须在 glMatrixMode() 之后立即调用 glLoadIdentity() 吗?
我之前一直在为“完整的”OpengGL 编写代码,在我的旧代码中,我首先调用了 glMatrixMode(),然后是 gluPerspective,最后是 glLoadIdentity()。就好像一个人首先设置什么矩阵应该用于 gluPerspective() 并最后设置 glIdentity() 来完成它。
调用 glMatrixMode()、glIdentity() 和 gluPerspective() 的正确顺序是什么?为什么? OpenGL 和 OpenGL ES 在设置 glMatrixMode() 方面有区别吗?
最佳答案
glViewport() 完全独立于矩阵变换堆栈,可以随时调用。
glLoadIdentity() 通常在矩阵模式更改后立即调用,因此如果您愿意,您可以“重新”开始。 gluPerspective()、glOrtho()、glFrustum()、glRotate()、glMultMatrix()、glTranslate() 等矩阵变换是累积操作,因为它们聚集在一起可以让您描述复杂的 3D 世界空间变换或描述您的 OpenGL View 体积。示例:如果我想要一个立方体在 +X 方向上平移然后绕 Z 轴旋转,我会发出一个 glRotate(),然后是一个 glTranslate()。
glLoadIdentity() 使用单位矩阵清除(当前矩阵模式的)矩阵,因此通过 glLoadIdentity() 跟随 gluPerspective() 等同于对 glLoadIdentity() 的一次调用。换句话说,该序列是荒谬的。
颠倒这些顺序,因为 gluPerspective() 会将当前矩阵乘以透视变换。如果当前矩阵是恒等矩阵,则乘法将简单地导致 gluPerspective() 矩阵变换,这在 99% 的情况下是您想要的投影矩阵模式。
在 glMatrixMode() 的行为或这些矩阵函数如何修改 GL 矩阵状态方面,OpenGL 和 OpenGL ES 之间没有区别。
关于android - 何时调用 glMatrixMode(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4195446/
将 glRotatef() 放在 glMatrixMode(GL_PROJECTION); 之后有什么区别 glMatrixMode(GL_PROJECTION); glLoadIdentity();
glMatrixMode(GL_PROJECTION)有什么区别和 glMatrixMode(GL_MODELVIEW) ? #include #include #include #define
我学习过的大多数 Android OpenGL ES 教程都有这样的 onSurfaceChanged() 函数: public void onSurfaceChanged( GL10 gl, int
我收到 0 个错误,但我在控制台中得到了这个: >Exception in thread "main" java.lang.NullPointerException >>at org.lwjgl.
我开始研究 OpenGL 的一些东西,我看到了很多调用 glMatrixMode 函数的例子。 根据我收集到的信息,将其设置为 GL_MODELVIEW 或 GL_PROJECTION(等)将激活该特
所以我正在阅读this LWJGL wiki 上的文章提到,“当使用‘向前兼容’上下文时,任何标记为已弃用的功能都将被删除。” 现在,当我实现与显示的前向兼容性时,每当我调用 glMatrixMode
static void resize(int width, int height) { const float ar = (float) width / (float) height;
我目前正在使用 SDL 1.2.4 和 C++Builder 10.0 Seattle。我设置了一个简单的测试程序来检查是否一切正常。 以下代码编译时没有警告或错误,但给我一个运行时错误: Excep
我正在阅读一本关于 OpenGL、SDL 的书,并且已经阅读了一些 OpenGL 文档。我也读过这篇文章:What does glLoadIdentity() do in OpenGL? 我正在掌握
我的下一个问题(或问题)是,当我用 glm 加载模型时,我能够看穿模型的某些部分,例如:如果有两座山在另一座前面,我可以看穿越近的山。 我会展示一张图片,但由于纹理不起作用,所以无法理解。 问题在这里
我想将 OpenGL 与 C++ 结合使用来创建一个带有“相机”(透视图)和要查看的对象的基本场景。我找到了示例代码 here .但出于某种原因,尽管我已将所有必要的包含和库捆绑在一起(见下文), /
在查看红皮书中的 reshape 示例时,我通常会发现如下内容: void reshape(int w, int h) { glViewport(0, 0, (GLsizei) w, (GLs
我有一个 iPhone 应用程序,我在 appDidFinishLaunching 中调用这三个函数: glMatrixMode(GL_PROJECTION); glOrthof(0, rect.si
在 Mac 上的 Parallels 中运行的 Windows 10 上,android 模拟器在启动时崩溃 C:\Android-SDK>.\tools\bin\avdmanager create
我的 OpenGL C++ 项目突然停止识别 glMatrixMode(GL_MODELVIEW)。我去吃晚饭,然后我的项目无法构建。 我在带有 CDT 插件的 Eclipse 中使用 Windows
我将先发布代码,然后发布以下问题: import java.util.Properties; import org.lwjgl.Sys; import org.lwjgl.input.Keyboard
使用 opengl es 演练黑莓 10 sdk。它使用 2 个命令,即: glMatrixMode(GL_PROJECTION); glLoadIdentity(); 及以后: glMatrixMo
我是一名优秀的程序员,十分优秀!