OpenGL矩阵和着色器混乱

时间:2015-10-15 20:06:14

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

我一直在使用GLM库跟踪现代OpenGL的教程 我在一个片段中,我们介绍了用于转换模型,定位相机和添加透视的矩阵。

我有一个三角形:

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);
}

所有东西都编译并运行,但我看不到三角形。我已经移动了三角形和相机,想到可能是相机指向错误的方向,但没有成功。在我们引入矩阵之前,我能够在屏幕上成功获得一个三角形,但现在没有三角形。三角形应位于原点,相机距离原点几个单位,看原点。

2 个答案:

答案 0 :(得分:4)

事实证明,您需要在 之后将着色器发送到着色器。 换句话说,您在 glUniformMatrix4fv()

之后致电glUseProgram()

答案 1 :(得分: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);
  }
}

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

更一般地说,删除东西直到某些东西有效,并且你理解它为什么起作用,然后重新添加部分,直到你停止理解为什么事情不起作用。我常常被一个标志或者乘法的顺序所取消。