gpt4 book ai didi

android - 何时调用 glMatrixMode()

转载 作者:太空狗 更新时间:2023-10-29 15:39:53 37 4
gpt4 key购买 nike

我学习过的大多数 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/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com