gpt4 book ai didi

c++ - 为什么在 OpenGL ES 2.0 中不需要 push/pop 矩阵等价?

转载 作者:行者123 更新时间:2023-11-30 02:01:29 27 4
gpt4 key购买 nike

考虑这个 OpenGL ES 1.1 代码,调用每一帧:

glPushMatrix();
glRotatef(m_currentAngle, 0, 0, 1);

//... enable, point, draw vertices

glPopMatrix();

一切都很好。现在,如果我删除 push/pop,我会得到连续的旋转动画,这是有道理的。

然而,在 ES 2.0 中,这里是等效的效果:

 //no glRotate so doing this:
float radians = m_currentAngle * 3.14159f / 180.0f;
float s = std::sin(radians);
float c = std::cos(radians);
float zRotation[16] = {
c, s, 0, 0,
-s, c, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1
};
GLint modelviewUniform = glGetUniformLocation(m_simpleProgram, "Modelview");
glUniformMatrix4fv(modelviewUniform, 1, 0, &zRotation[0]);

//... then enable, point and draw vertices

这也创建了正确的图像,但尽管没有什么等同于“推/弹出”技术,它不会连续旋转。为什么2.0不能连续旋转,而1.1可以?

或者换句话说,为什么 1.1 需要 push/pop 来防止连续动画,而 2.0 不需要?

最佳答案

旧式流水线专为场景图使用而设计。当你引入一个新的变换时,它会与当前的变换连接起来,所以为了能够制作场景图,你可以在访问子节点时将当前的变换推到提供的堆栈上,应用局部变换,做一些渲染,然后再次弹出变换以返回到父变换。

对于 GL 的渲染/光照管道来说,它也必须能够理解所使用的矩阵,这就是为什么它被分成“投影”和“模型 View ”。

新风格的管道不会做任何这些。您在该管道中所做的是指定您想要渲染的确切矩阵。当您指定一个不同的矩阵时,它只会替换现有的任何内容。

你的例子相当于做:

glLoadIdentity()
glRotate()

所以没有连续旋转。

如果你想要连接、推送、弹出等,你可以自己实现。您需要存储先前的矩阵值,并将其相乘。或者,更新旋转值。

造成这种情况的原因有很多,其中最重要的是可编程管道对您可能如何变换顶点的定义不太严格,因此它将必要矩阵的构造留给了程序员。也许您甚至没有矩阵,但在着色器中构造变换。

关于c++ - 为什么在 OpenGL ES 2.0 中不需要 push/pop 矩阵等价?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14051277/

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