我刚看过这个:
“OpenGL提供了支持 用于使用标准矩阵堆栈管理坐标转换和投影 (GL_MODELVIEW和GL_PROJECTION)。然而,在核心OpenGL 4.0中,所有功能 支持矩阵堆栈已被删除。因此,我们有责任提供自己的 支持通常的转换和投影矩阵,然后将它们传递给我们 着色器“。
这很奇怪,那么如何设置模型视图和投影矩阵呢?我应该创造 它们在opengl app中,然后将顶点着色器中的顶点与矩阵相乘?
答案 0 :(得分:11)
这很奇怪
不。固定功能被可编程管道取代,可让您根据需要设计转换。
我应该在opengl app中创建它们,然后将顶点着色器中的顶点与矩阵相乘?
如果你想拥有一些可以像旧的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());
我假设你有一个支持.translate()
等操作的Matrix4x4类。像GLM这样的库可以为您提供像对应的GLSL类型一样的矩阵和向量的客户端实现,以及gluPerspective
等函数的实现。
您还可以通过OpenGL兼容性配置文件继续使用OpenGL 1功能,但不建议这样做(您不会使用OpenGL的全部功能)。
OpenGL 3(和4)的界面比OpenGL 1更低;如果你认为上面的代码太多了,那么你很有可能会使用像Irrlicht这样的渲染引擎。
答案 1 :(得分:4)
矩阵堆栈是不推荐使用的固定功能管道的一部分。您仍然可以通过兼容性扩展来访问旧功能,但您应该避免这样做。
关于矩阵和相机有一些很好的教程但是我更喜欢this one.将矩阵发送到着色器并如你所说的那样乘以矩阵的顶点。