2012-11-30 68 views
4

我刚读此:OpenGL中的矩阵堆栈弃用?

“的OpenGL用于管理坐标使用标准的矩阵变换和突起提供了支持 栈 (GL_MODELVIEW和GL_PROJECTION)在芯的OpenGL 4.0,但是,所有的支持基质堆的功能 。因此,我们需要为通常的转换和投影矩阵提供我们自己的 支持,然后将它们传递到我们的 着色器中。“

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

回答

10

这是奇怪的

都能跟得上。固定功能被可编程流水线取代,可让您根据需要设计您的转换。

我应该在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()); 

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


您也可以继续使用通过OpenGL的相容性分布了OpenGL 1的功能,但不推荐(你会不会用OpenGL的全部潜力随后)。

OpenGL 3(和4)的界面比OpenGL 1更低;如果你认为上面的代码太多,那么你最好用Irrlicht等渲染引擎。

+1

既然你必须重新编码它,它也是摆脱这个愚蠢的模型视图概念的完美时刻,并将它分成两个单独的矩阵。 – Calvin1602

+1

@ Calvin1602这是一个优化,而不是“概念” – Kos

+0

使用GLM绝对是一个平滑过渡。我会强调完全避免兼容性配置文件的重要性。特别是如果你想要性能和更便携的代码库。 – Grimmy

4

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

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

+0

链接已死,请你提供一个新的? – Krythic

+1

@Krythic的couse,更新! –

+0

我真的很感激。=) – Krythic