2013-04-04 68 views
0

我的程序的目标是显示一个简单的Y轴上旋转的彩色三角形,没有任何平移。我正在使用GLM库。问题是我的三角形的转换不正确:它有一个奇怪而不合逻辑的行为。这里是我的C++代码以及顶点着色器和片段着色器代码:使用openGL GLM和着色器不正确的旋转

C++代码:

float angle = 0.0f; 

struct Vertex 
{ 
    float x, y, z; 
}; 

static Vertex vertices[9] = 
{ 
    -1.000000f, 0.000000f, 0.000000f, 
    0.000000f, 1.000000f, 0.000000f, 
    1.000000f, 0.000000f, 0.000000f 
}; 

static Vertex colors[9] = 
{ 
    1.000000f, 0.000000f, 0.000000f, 
    0.000000f, 1.000000f, 0.000000f, 
    0.000000f, 0.000000f, 1.000000f 
}; 

[...] 

int     
main(int ac, char **av) 
{ 
    bool   continuer = true; 
    SDL_Event  event; 
    GLuint   vboID[2]; 
    GLuint   programID = 0; 

    //SDL window initialization 

    SDL_Init(SDL_INIT_VIDEO); 
    SDL_WM_SetCaption("VBO tests",NULL); 
    SDL_SetVideoMode(WIDTH, HEIGHT, 32, SDL_OPENGL); 

    //Viewport initialization 

    glViewport(0, 0, WIDTH, HEIGHT); 

    //Projection initialization 

    glm::mat4 projection = glm::mat4(1.0f); 
    projection = glm::perspective<GLfloat>(60.0f, (float)(WIDTH/HEIGHT), 1.0f, 1000.0f); 

    //View initialization 

    glm::mat4 view = glm::lookAt<GLfloat>(glm::vec3(0.0f, 0.0f, 8.0f), glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f)); 

    glewInit(); 

    //Shaders initialization 

    programID = initShaders("triangle.vert", "triangle.frag"); 

    //Main loop 

    while (continuer) 
    { 
     eventListener(&event, &continuer); 

     glClearDepth(1.0f); 
     glClearColor(0.13f, 0.12f, 0.13f, 1.0f); 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

     glUseProgram(programID); 

     //Model transformations 

     glm::mat4 model = glm::mat4(1.0f); 
     model *= glm::translate(model, glm::vec3(0.0f, 0.0f, 0.0f)); 
     model *= glm::rotate(model, angle, glm::vec3(0.0f, 1.0f, 0.0f)); 

     glm::mat4 ModelViewMatrix = model * view; 
     glm::mat4 ModelViewProjectionMatrix = projection * ModelViewMatrix; 

     glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, vertices); 
     glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, colors); 

     glEnableVertexAttribArray(0); 
     glEnableVertexAttribArray(1); 

     glUniformMatrix4fv(glGetUniformLocation(programID, "ModelView"), 1, GL_TRUE, glm::value_ptr(ModelViewMatrix)); 
     glUniformMatrix4fv(glGetUniformLocation(programID, "MVP"), 1, GL_TRUE, glm::value_ptr(ModelViewProjectionMatrix)); 

     glDrawArrays(GL_TRIANGLES, 0, 3); 

     glDisableVertexAttribArray(1); 
     glDisableVertexAttribArray(0); 

     glUseProgram(0); 

     angle += 0.020f; 

     glFlush(); 
     SDL_GL_SwapBuffers(); 
    } 

    SDL_Quit(); 
    return (0); 
} 

顶点着色器代码:

#version 330 

in vec3 VertexPosition; 
in vec3 VertexColor; 

uniform mat4 ModelViewMatrix; 
uniform mat4 MVP; 

out vec3 Color; 

void main() 
{ 
    Color = VertexColor; 

    gl_Position = MVP * vec4(VertexPosition, 1.0f); 
} 

片段着色器代码:

#version 330 

in vec3 Color; 
out vec4 FragColor; 

void main() { 
    FragColor = vec4(Color, 1.0); 
} 

当我为模型声明了一个简单的矩阵旋转,我将它发送给顶点着色器,并将其用作M副总裁,它的作品。但是当我添加投影矩阵+视图矩阵时,它无法正常工作。这里有一个画面:

enter image description here

通常情况下,三角应该是在屏幕的中央。

有人能帮助我吗?

+0

你是什么意思,当你说“当我添加投影矩阵+视图矩阵它不能正常工作”?添加到什么?什么工作不正确?你在屏幕上看到什么? – PowerApp101 2013-04-05 02:45:36

+0

我想说当我多次将视图,投影和模型矩阵放在一起时,我的照片上面出现了糟糕的渲染效果。但是当我删除代码中的视图和投影时,我只保留模型转换矩阵。这个三角形当然更接近因为我没有视图和投影,但它正确地转动了Y轴。我想要具有相同的行为,但投影和视图矩阵。我的代码对你来说似乎是否正确? (C++和顶点着色器) – user1364743 2013-04-05 09:37:27

+0

您可以将代码发布到您创建视图和投影矩阵的位置以及将矩阵相乘的位置吗? – bwroga 2013-04-05 12:41:12

回答

1

这条线:

glm::mat4 ModelViewMatrix = model * view; 

也许应该改为:

glm::mat4 ModelViewMatrix = view * model; 

矩阵计算都在反向做,并且要通过模型矩阵相乘首先你的顶点,而不是视图。

你也可以看看my other answer,稍微解释一下这些概念。

+0

感谢您的回答。 – user1364743 2013-04-08 02:18:16