【问题标题】:OpenGL Matrices and Shaders ConfusionOpenGL 矩阵和着色器混淆
【发布时间】:2015-10-15 20:06:13
【问题描述】:

我一直在学习有关现代 OpenGL 和 GLM 库的教程 我正在介绍用于转换模型、定位相机和添加视角的矩阵。

我有一个三角形:

const GLfloat vertexBufferData[] = {
 -1.0f, -1.0f,  0.0f,
  1.0f, -1.0f,  0.0f,
  0.0f,  1.0f,  0.0f,
};

我有我的着色器:

GLuint programID = loadShaders("testVertexShader.glsl",
                               "testFragmentShader.glsl");

我有一个不进行转换的模型矩阵:

glm::mat4 modelMatrix = glm::mat4(1.0f);  /* Identity matrix */

我有一个相机矩阵:

glm::mat4 cameraMatrix = glm::lookAt(
  glm::vec3(4.0f, 4.0f, 3.0f),  /*Camera position*/
  glm::vec3(0.0f, 0.0f, 0.0f),  /*Camera target*/
  glm::vec3(0.0f, 1.0f, 0.0f)   /*Up vector*/
 );

我有一个投影矩阵:

glm::mat4 projectionMatrix = glm::perspective(
 90.0f,        /*FOV in degrees*/
 4.0f / 3.0f,  /*Aspect ratio*/
 0.1f,         /*Near clipping distance*/
 100.0f        /*Far clipping distance*/
);

然后我将所有矩阵相乘,得到我要绘制的三角形的最终矩阵:

glm::mat4 finalMatrix = projectionMatrix
                      * cameraMatrix
                      * modelMatrix;

然后我将矩阵发送到 GLSL(我认为?):

GLuint matrixID = glGetUniformLocation(programID, "MVP");
glUniformMatrix4fv(matrixID, 1, GL_FALSE, &finalMatrix[0][0]);

然后我做一些我不太了解的着色器:

/*vertex shader*/
#version 330 core

in vec3 vertexPosition_modelspace;
uniform mat4 MVP;

void main(){
 vec4 v = vec4(vertexPosition_modelspace, 1);
 gl_Position = MVP * v;
}

/*fragment shader*/
#version 330 core
out vec3 color;

void main(){
 color = vec3(1, 1, 0);
}

一切都编译并运行,但我看不到三角形。我已经移动了三角形和相机,认为相机可能指向错误的方向,但没有成功。在我们介绍矩阵之前,我能够在屏幕上成功地得到一个三角形,但现在,没有三角形。三角形应该在原点,相机距离原点几个单位,看着原点。

【问题讨论】:

    标签: c++ opengl matrix shader glm-math


    【解决方案1】:

    事实证明,您需要在绑定着色器之后将矩阵发送到着色器。 换句话说,你调用glUniformMatrix4fv() 之后 glUseProgram()

    【讨论】:

    • OpenGL 是超级有状态的——一些现代的 OpenGL 包装库试图在抽象中隐藏更多的状态以避免像这样的微妙问题。如果您在正确的位置仔细阅读,该 wiki 通常可以很好地解释哪些函数会影响哪些状态,但是尝试找到一个可以为您执行此操作的更高级别的库要容易得多。
    • @bfops 这太无情了。不过,我很喜欢学习它。 :)
    • 您可能想查看Direct State Access 扩展。它允许您在不绑定对象的情况下设置内容。例如,您可以使用 glProgramUniformMatrix4fv 而不是使用 glUniformMatrix4fv,第一个参数是程序 id,而无需绑定程序。
    【解决方案2】:

    很多事情都可能是您的问题 - 尝试输出 vec4 颜色,并将 alpha 显式设置为 1。我经常做的一件事是让顶点着色器忽略所有输入,只输出直接顶点,例如类似:

    void main(){
      if (gl_VertexID == 0) {
        gl_Position = vec4(-1, -1, 0, 1);
      } else if (gl_VertexID == 1) {
        gl_Position = vec4(1, -1, 0, 1);
      } else if (gl_VertexID == 2) {
        gl_Position = vec4(0, 1, 0, 1);
      }
    }
    

    如果可行,那么您可以尝试重新添加顶点位置输入。如果可行,您可以重新添加相机或投影矩阵等。

    更一般地说,删除一些东西,直到你明白它为什么起作用,然后再添加部分,直到你不再理解为什么它不起作用。我经常被一个符号或乘法的顺序所取代。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-29
      • 1970-01-01
      • 2015-07-07
      • 2012-05-08
      • 2022-01-02
      • 1970-01-01
      相关资源
      最近更新 更多