这很奇怪
没有。固定功能已被可编程管道取代,可让您根据需要设计转换。
我应该在 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 http://glm.g-truc.net/可以为您提供矩阵和向量的客户端实现,其行为类似于相应的 GLSL 类型,以及类似函数的实现gluPerspective
.
您还可以通过 OpenGL 兼容性配置文件继续使用 OpenGL 1 功能,但不建议这样做(届时您将无法充分利用 OpenGL 的潜力)。
OpenGL 3(和4)的接口比OpenGL 1更加底层;如果您认为上面的代码太多,那么您最好使用渲染引擎,例如 Irrlicht。