在我的OpenGL应用程序中,我使用gluLookAt()
来转换我的相机。然后我有两个不同的渲染功能;一个使用原始渲染(glBegin()/glEnd()
)来渲染三角形。
glBegin(GL_TRIANGLES);
glVertex3f(0.25, -0.25, 0.5);
glVertex3f(-0.25, -0.25, 0.5);
glVertex3f(0.25, 0.25, 0.5);
glEnd();
第二个渲染函数使用着色器使用相同的坐标显示三角形,并使用函数glDrawArrays(GL_TRIANGLES, 0, 3)
调用。 shader.vert如下所示:
#version 430 core
void main()
{
const vec4 verts[3] = vec4[3](vec4(0.25, -0.25, 0.5, 1),
vec4(-0.25, -0.25, 0.5, 1),
vec4(0.25, 0.25, 0.5, 1));
gl_Position = verts[gl_VertexID];
}
现在这是我的问题;如果我使用三角形的原始渲染来移动相机,我会看到不同角度的三角形,就像人们期望的那样。当我使用着色器渲染功能时,三角形保持静止。显然,我遗漏了一些关于世界坐标以及它们与使用着色器渲染的对象的关系。有人能指出我正确的方向吗?
答案 0 :(得分:2)
如果您没有活动着色器程序,则可以使用所谓的"固定管道"。固定管道基于您使用OpenGL API调用设置的众多属性执行渲染。例如,您指定要应用的转换。您可以指定控制几何体照明的材质和光源属性。然后应用这些属性由OpenGL处理。
使用自己的着色器程序后,您就不再使用固定管道了。这意味着以前为您处理的固定管道的大部分内容必须在着色器代码中实现。应用转换是其中的一部分。要应用变换矩阵,您必须将其传递到着色器,并将其应用于着色器代码。
矩阵通常在顶点着色器中声明为uniform
变量:
uniform mat4 ModelViewProj;
然后应用于您的顶点:
gl_Position = ModelViewProj * verts[gl_VertexID];
在您的代码中,您将使用glGetUniformLocation()
,glUniformMatrix4fv()
等调用来设置矩阵。详细解释这个问题有点超出了这个答案,但您应该可以在许多在线OpenGL教程中找到它。
只要您仍在使用兼容性配置文件的旧版功能,实际上这是一种更简单的方法。您应该知道这已被弃用,并且在OpenGL核心配置文件中不可用。兼容性配置文件使着色器代码可以使用某些固定功能属性,包括转换矩阵。因此,您不必声明任何内容,只需写下:
gl_Position = gl_ModelViewProjectionMatrix * verts[gl_VertexID];