5

我刚读到这个:

“OpenGL 提供了使用标准矩阵堆栈(GL_MODELVIEW 和 GL_PROJECTION)管理坐标变换和投影的支持。然而,在核心 OpenGL 4.0 中,所有支持矩阵堆栈的功能都已被删除。因此,我们有责任提供我们的自己支持通常的转换和投影矩阵,然后将它们传递到我们的着色器中。”

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

4

2 回答 2

12

这很奇怪

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

我应该在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。

于 2012-11-30T14:45:04.677 回答
6

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

有一些关于矩阵和相机的很好的教程,但我更喜欢这个。如您所说,将矩阵发送到着色器并乘以矩阵的顶点。

于 2012-11-30T14:39:45.233 回答