我一直在使用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);
}
所有东西都编译并运行,但我看不到三角形。我已经移动了三角形和相机,想到可能是相机指向错误的方向,但没有成功。在我们引入矩阵之前,我能够在屏幕上成功获得一个三角形,但现在没有三角形。三角形应位于原点,相机距离原点几个单位,看原点。
答案 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);
}
}
如果可以,那么您可以尝试重新添加顶点位置输入。如果可行,您可以将相机或投影矩阵添加回来等。
更一般地说,删除东西直到某些东西有效,并且你理解它为什么起作用,然后重新添加部分,直到你停止理解为什么事情不起作用。我常常被一个标志或者乘法的顺序所取消。