OpenGL中的矩阵堆栈已弃用?

OpenGL中的矩阵堆栈已弃用?,opengl,glsl,Opengl,Glsl,我刚刚读到: “OpenGL提供了支持 用于使用标准矩阵堆栈管理坐标变换和投影 (GL_模型视图和GL_投影)。但是,在核心OpenGL 4.0中,所有功能 矩阵堆栈的支持已被移除。因此,由我们自己提供 支持常用的变换和投影矩阵,然后将它们传递到 着色器。” 这很奇怪,那么现在如何设置modelview和投影矩阵呢?我应该创造 然后将顶点着色器中的顶点与矩阵相乘?矩阵堆栈是不推荐使用的固定函数管道的一部分。您仍然可以通过兼容性扩展访问旧功能,但应避免这样做 有一些很好的关于矩阵和相机的教程,但我

我刚刚读到:

“OpenGL提供了支持 用于使用标准矩阵堆栈管理坐标变换和投影 (GL_模型视图和GL_投影)。但是,在核心OpenGL 4.0中,所有功能 矩阵堆栈的支持已被移除。因此,由我们自己提供 支持常用的变换和投影矩阵,然后将它们传递到 着色器。”

这很奇怪,那么现在如何设置modelview和投影矩阵呢?我应该创造
然后将顶点着色器中的顶点与矩阵相乘?

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

有一些很好的关于矩阵和相机的教程,但我更喜欢将矩阵发送到着色器,并像您所说的那样,将顶点与矩阵相乘

这很奇怪

没有。固定功能已被可编程管道所取代,该管道允许您根据需要设计转换

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

如果您想拥有类似于旧OpenGL矩阵堆栈对的功能,则需要使顶点着色器看起来,例如:

in vec4 vertexPosition; 
// ...

uniform mat4 ModelView, Projection;

void main() {
    gl_Position = Projection * ModelView * vertexPosition;
    // ...
}
(当然,你可以稍微优化一下)

和相应的客户端大小代码(如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());
std::stack modelViewStack;
std::stack projectonstack;
//通过初始化它们
modelViewStack.push(Matrix4x4.Identity());
projectionStack.push(Matrix4x4.Identity());
//GLP矩阵:
stack.push(stack.top());
//'stack'是一个堆栈或另一个堆栈;
//在旧的OpenGL中,通过glMatrixMode切换受影响的堆栈
//GLPOP矩阵:
stack.pop();
//家庭与家庭:
stack.top().translate(1,0,0);
//为了将最顶层的ModelView矩阵传递给着色器程序:
GLint modelViewLocation=glGetUniformLocation(aLinkedProgramObject,
“模型视图”);
glUniformMatrix4fv(modelViewLocation,1,false和modelViewStack.top());
这里我假设您有一个Matrix4x4类,它支持像
.translate()
这样的操作。像这样的库可以为您提供行为类似于相应GLSL类型的矩阵和向量的客户端实现,以及类似于
glupspective
的函数实现


您也可以通过OpenGL兼容性配置文件继续使用OpenGL 1功能,但不建议这样做(您将无法充分利用OpenGL的潜力)


OpenGL3(和4)的界面比OpenGL1更低级;如果你认为上面的代码太多,那么你最好使用一个渲染引擎,比如Irrlicht。

因为你必须重新编码它,它也是摆脱这个愚蠢的模型视图概念的完美时刻,并且把它分成两个独立的矩阵。@ Calv1602这是一个优化,而不是一个“概念”。使用GLM绝对是一个平滑的过渡。我要强调完全避免兼容性配置文件的重要性。特别是如果你想要性能和更具可移植性的代码库,我一直在将一些项目移植到OSX上,对于使用兼容模式的人,我感到非常沮丧。这么多额外的工作是因为过去人们很懒。每当我看到一个
glBegin(GL\u QUADS)
想到我的额外工作以及由此造成的性能损失时,我都会感到害怕。@Grimmy extra work。想想驱动程序供应商;-)链接已失效,请提供一个新链接好吗?@Krythic Of couse,已更新!我真的很感激