【问题标题】:OpenGL Camera Movement - Shader vs. Primitive RenderingOpenGL 相机运动 - 着色器与原始渲染
【发布时间】:2023-04-08 04:07:01
【问题描述】:

在我的 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];
}

现在这是我的问题;如果我使用三角形的原始渲染来移动相机,我会从不同的角度看到三角形,就像人们所期望的那样。当我使用着色器渲染功能时,三角形保持静止。显然,我错过了一些关于世界坐标以及它们与使用着色器渲染的对象的关系。有人能指出我正确的方向吗?

【问题讨论】:

    标签: opengl glsl shader


    【解决方案1】:

    如果您没有活动的着色器程序,则您正在使用所谓的“固定管道”。固定管道根据您使用 OpenGL API 调用设置的众多属性执行渲染。例如,您指定要应用的转换。您可以指定控制几何体照明的材质和灯光属性。然后由 OpenGL 处理应用这些属性。

    一旦您使用了自己的着色器程序,您就不再使用固定管道。这意味着以前为您处理的大部分固定管道必须在您的着色器代码中实现。应用转换是其中的一部分。要应用您的变​​换矩阵,您必须将其传递到着色器中,并将其应用到您的着色器代码中。

    矩阵通常在顶点着色器中声明为uniform 变量:

    uniform mat4 ModelViewProj;
    

    然后应用到您的顶点:

    gl_Position = ModelViewProj * verts[gl_VertexID];
    

    在您的代码中,您将使用glGetUniformLocation()glUniformMatrix4fv() 等调用来设置矩阵。详细解释这一点有点超出这个答案,但您应该能够在许多在线 OpenGL 教程中找到它。

    只要您仍然使用兼容性配置文件的旧功能,实际上还有一种更简单的方法。您应该知道这是不推荐使用的,并且在 OpenGL 核心配置文件中不可用。兼容性配置文件使某些固定函数属性可用于您的着色器代码,包括转换矩阵。所以你不必声明任何东西,可以简单地写:

    gl_Position =  gl_ModelViewProjectionMatrix * verts[gl_VertexID];
    

    【讨论】:

      猜你喜欢
      • 2011-05-04
      • 2016-09-12
      • 2012-02-27
      • 1970-01-01
      • 2013-10-05
      • 1970-01-01
      • 1970-01-01
      • 2018-02-17
      • 1970-01-01
      相关资源
      最近更新 更多