2016-07-29 192 views
0

当我试着画出我的网,我得到了这样的事情:3D网格投影到二维平面

that

但是,当我转动我的网格,它是这样的:

this

这是应该的:

This

这里是我的代码:

// Generate MVP matrix. 
glm::mat4 Projection = glm::perspective(glm::radians(45.0f), 
             4.0f/3.0f, 0.1f, 100.0f); 
glm::mat4 View = glm::lookAt(glm::vec3(4,0,4), 
          glm::vec3(0,0,0), 
          glm::vec3(0,0,1)); 
glm::mat4 Model = glm::mat4(1.0f); 
glm::mat4 mvp = Projection * View * Model; 
GLint matrixId = glGetUniformLocation(shader.getProgramId(), "MVP"); 

// Generate VBO and VAO. 
float triangleVertices[] = { 
    -0.5f, -0.5f, 0.0f, 1.0f, 
    0.5f, 0.5f, 0.0f, 1.0f, 
    0.5f, -0.5f, 0.0f, 1.0f, 
    1.0f, 1.0f, 0.0f, 1.0f, 
    1.0f, -1.0f, 0.0f, 1.0f, 
    1.0f, -1.0f, 1.0f, 1.0f, 
}; 
uint un_vertecesNum = sizeof(triangleVertices); 
GLuint vbo; 
glGenBuffers(1, &triangleBufferObject); 
GLuint vao; 
glGenVertexArrays(1, &vao); 
glBindVertexArray(vao); 
glBindBuffer(GL_ARRAY_BUFFER, vbo); 
glBufferData(GL_ARRAY_BUFFER, vertecesNum, 
      triangleVertices, GL_STATIC_DRAW); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

// Begin main loop. 
// Event handling here (Look for code below) 
glClearColor(0.0,0.0,0.0,0.0); 
glClear(GL_COLOR_BUFFER_BIT); 
shader.Use(); 
glUniformMatrix4fv(matrixId, 1, GL_FALSE, &mvp[0][0]); 

// Mesh display stuff. 
glBindBuffer(GL_ARRAY_BUFFER, vbo); 
glEnableVertexAttribArray(0); 
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0); 
glDrawArrays(GL_TRIANGLES, 0, un_vertecesNum); 
glDisableVertexAttribArray(0); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

shader.UnUse(); 
SDL_GL_SwapWindow(win); 
// End main loop. 

这里的事件处理,我怎么转动我的目:

SDL_Event event; 
while (SDL_PollEvent(&event)) 
{ 
    switch(event.type) 
    { 
    case SDL_KEYDOWN: 
     switch(event.key.keysym.sym) 
     { 
      case SDLK_a: 
       Model = glm::rotate(Model, 0.1f, 
         glm::vec3(0.0f, 1.0f, 0.0f)); 
      case SDLK_d: 
       Model = glm::rotate(Model, 0.1f, 
         glm::vec3(0.0f, -1.0f, 0.0f)); 
       break; 
     } 
     break; 
    } 
} 
mvp = Projection * View * Model; 

韦尔着色器:

#version 130 
uniform mat4 MVP; 
attribute vec4 coord4d; 
void main(void) 
{ 
    vec4 temp = vec4(coord4d); 
    gl_Position = temp*(MVP); 
} 

破片着色器:

#version 130 
void main(void) 
{ 
    gl_FragColor[0] = gl_FragCoord.x/640.0; 
    gl_FragColor[1] = 0.2; 
    gl_FragColor[2] = gl_FragCoord.y/480.0; 
    gl_FragColor[3] = 1.0f; 
} 

这是苏珊怎么看,如果你不知道这样的:

img1 img1

我试图谷歌,读一些关于它的“典型错误“页面或在stackoverflow找到,但没有。

+1

垂直着色器不应该是“MVP * temp”吗? – 2016-07-29 09:26:48

+2

@willywonkadailyblah是对的。另外,你可以简单地写'gl_Position = MVP * coord4d;'而不用'temp'变量。 –

+0

我的上帝......解决办法很简单。 @willywonkadailyblah,请在回答中写下您的评论,以便我可以将其标记为正确。 –

回答

2

顶点着色器应该是MVP * temp,而不是相反。就像在现实世界中一样,在GLSL矩阵向量乘法是不可交换的(这将是您正在寻找的“典型错误”)