2015-10-15 184 views
1

我一直在关注有关GLM库的现代OpenGL教程 我正在介绍用于变换模型,定位相机和添加透视图的矩阵。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); 
} 

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

回答

4

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

+1

OpenGL是超级有状态的 - 一些现代的OpenGL封装库尝试在抽象中隐藏更多的状态以避免这样的细微问题。如果你在恰当的地方仔细阅读,那么wiki通常对于解释哪些功能会影响哪种状态非常好,但是尝试找到可以为你做到这一点的更高级别的库更容易。 – bfops

+0

@bfops这是相当无情的。不过,我很享受这方面的知识。 :) –

+0

您可能想查看[Direct State Access](https://www.opengl.org/registry/specs/EXT/direct_state_access.txt)扩展名。它允许你设置东西而不绑定对象。例如,不使用glUniformMatrix4fv,可以使用glProgramUniformMatrix4fv,其中第一个参数是程序标识,而不需要绑定程序。 – mOfl

2

许多事情可能是你的问题 - 尝试输出vec4颜色代替,阿尔法明确设置为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); 
    } 
} 

如果这样的作品,那么你可以尝试将你的顶点位置输入回到如果这样的作品,你可以添加你的相机或投影矩阵回来,等

更一般地,删除东西,直到某些东西有效,并且你明白它为什么起作用,然后再添加部分,直到你停止理解为什么事情不起作用。很多时候我已经被一个符号或者乘法次序排除了。