OpenGL中的Matrix堆栈已弃用?

use*_*942 5 opengl glsl

我刚看过这个:

"OpenGL为使用标准矩阵堆栈(GL_MODELVIEW和GL_PROJECTION)管理坐标转换和投影提供了支持.但是,在核心OpenGL 4.0中,所有支持矩阵堆栈的功能都已被删除.因此,我们需要提供支持通常的转换和投影矩阵,然后将它们传递给我们的着色器."

这很奇怪,那么如何设置模型视图和投影矩阵呢?我应该在opengl应用程序中创建它们,然后将顶点着色器中的顶点与矩阵相乘?

Kos*_*Kos 12

这很奇怪

不.固定功能被可编程管道取代,可以让您根据需要设计转换.

我应该在opengl应用程序中创建它们,然后将顶点着色器中的顶点与矩阵相乘?

如果你想拥有一些可以像旧的OpenGL矩阵堆栈那样工作的东西,那么你想要让你的顶点着色器看起来像,例如:

in vec4 vertexPosition; 
// ...

uniform mat4 ModelView, Projection;

void main() {
    gl_Position = Projection * ModelView * vertexPosition;
    // ...
}
Run Code Online (Sandbox Code Playgroud)

(当然,你可以优化一下)

相应的客户端大小代码(在此处显示为C++)将如下所示:

std::stack<Matrix4x4> modelViewStack;
std::stack<Matrix4x4> projectionStack;

// Initialize them by
modelViewStack.push(Matrix4x4.Identity());
projectionStack.push(Matrix4x4.Identity());

// glPushMatrix:
stack.push(stack.top());
    // `stack` is either one stack or the other;
    // in old OpenGL you switched the affected stack by glMatrixMode

// glPopMatrix:
stack.pop();

// glTranslate and family:
stack.top().translate(1,0,0);

// And in order to pass the topmost ModelView matrix to a shader program:
GLint modelViewLocation = glGetUniformLocation(aLinkedProgramObject,
                                               "ModelView");
glUniformMatrix4fv(modelViewLocation, 1, false, &modelViewStack.top());
Run Code Online (Sandbox Code Playgroud)

我假设你有一个支持像这样的操作的Matrix4x4类.translate().像GLM这样的库可以为您提供矩阵和向量的客户端实现,其行为类似于相应的GLSL类型,以及类似函数的实现gluPerspective.


您还可以通过OpenGL兼容性配置文件继续使用OpenGL 1功能,但不建议这样做(您不会使用OpenGL的全部功能).

OpenGL 3(和4)的界面比OpenGL 1更低; 如果你认为上面的代码太多了,那么你很有可能会使用像Irrlicht这样的渲染引擎.

  • @Calvin1602 这是一种优化,而不是“概念” (2认同)
  • @Grimmy额外的工作?[那没什么](http://i.imgur.com/B3XoS.png).想想司机供应商;-) (2认同)

Fel*_* K. 6

矩阵堆栈是已弃用的固定功能管道的一部分。您仍然可以通过兼容性扩展访问旧功能,但应避免这样做。

有一些关于矩阵和相机的很好的教程,但我更喜欢这一本书。将您的矩阵发送到着色器,然后将顶点与该矩阵相乘。