OpenGL矩阵和着色器混淆

OpenGL Matrices and Shaders Confusion

本文关键字:OpenGL      更新时间:2023-10-16

我一直在使用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);
}

一切都编译并运行,但是我没有看到三角形。我移动了三角形和摄像机,想着也许摄像机指向了错误的方向,但没有成功。在引入矩阵之前,我可以成功地在屏幕上画出一个三角形,但是现在,没有三角形了。这个三角形应该在原点,相机距离原点几个单位,看着原点。

原来,你需要发送矩阵到着色器你已经绑定了着色器。换句话说,在之后调用glUniformMatrix4fv() glUseProgram()

很多事情都可能是您的问题-尝试输出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);
  }
}

如果这有效,那么你可以尝试添加你的顶点位置输入。如果这是有效的,你可以添加你的相机或投影矩阵回来,等等。

更一般地说,删除一些东西,直到有些东西可以工作,并且你明白为什么它可以工作,然后添加部分,直到你不再理解为什么它不能工作。我经常错了一个符号,或者错了乘法的顺序。