OpenGL / GLSL - 更改Glm Manipulation的查看/模型矩阵

时间:2013-11-12 00:33:08

标签: opengl glsl glm-math

我似乎无法将我的Square放入正确的查看矩阵中,以便使用glm函数对其进行操作。

这基本上是我的main.cpp,它由init()组成,它加载纹理,glsl vert / frag文件并构造ground class的方块。还有一个reshape()display()函数调用drawGround()来渲染实际的正方形。

drawGround()内部,我添加了模型/视图矩阵,并做了一个小翻译,但它不起作用......我已经玩了几个小时,似乎无法得到它工作....

void display()                                  
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    drawGround();
    glUseProgram(0); 
}

void drawGround(){
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glUseProgram(myShader.handle());
        GLuint matLocation = glGetUniformLocation(myShader.handle(), "ProjectionMatrix");  
        glUniformMatrix4fv(matLocation, 1, GL_FALSE, &ProjectionMatrix[0][0]);

        glm::mat4 viewingMatrix = glm::translate(glm::mat4(1.0),glm::vec3(0,0,-1));
        ModelViewMatrix = glm::translate(viewingMatrix,glm::vec3(15.0,0.0,0));

        glUniformMatrix4fv(glGetUniformLocation(myShader.handle(), "ModelViewMatrix"), 1, GL_FALSE, &ModelViewMatrix[0][0]);

    ground.render(texName, &myShader);

    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glBindVertexArray(0);
    glUseProgram(0);
}

然而在我的其他程序中,我有以下函数renderSky(),它可以正常工作。 请帮我弄明白我哪里错了... 如果您需要查看Ground Class,请告诉我。

void renderSky(){
    glUseProgram(mySkyShader.handle());
    GLuint matLocation = glGetUniformLocation(mySkyShader.handle(), "ProjectionMatrix");  
    glUniformMatrix4fv(matLocation, 1, GL_FALSE, &ProjectionMatrix[0][0]);

        glm::mat4 viewingMatrix = glm::translate(glm::mat4(1.0),glm::vec3(0,0,-1));
        ModelViewMatrix = glm::translate(viewSkyMatrix,glm::vec3(15,0,0));

        glUniformMatrix4fv(glGetUniformLocation(mySkyShader.handle(), "ModelViewMatrix"), 1, GL_FALSE, &ModelViewMatrix[0][0]);
    skyBox.render();

    glUseProgram(0);
}

这是顶点着色器:

#version 150

in  vec3 in_Position;
in  vec4 in_Color;
out vec4 ex_Color;

in vec2 in_TexCoord;
out vec2 ex_TexCoord;

void main(void)
{
gl_Position =  vec4(in_Position, 1.0);
ex_Color = in_Color;

ex_TexCoord = in_TexCoord;
}

1 个答案:

答案 0 :(得分:0)

为了使对象进入正确的模型/视图空间,必须将其与顶点着色器中的in_Position相乘。

gl_Position = vec4(in_Position, 1.0);变成了这个:

gl_Position = ProjectionMatrix * ModelViewMatrix * vec4(in_Position, 1.0);

此外,模型和投影矩阵需要在着色器中添加制服:

uniform mat4 ModelViewMatrix;
uniform mat4 ProjectionMatrix;

顶点着色器使用此附加代码,并允许任何后续glm函数操纵矩阵。