2016-07-29 5 views
0

에 투사되어,이 같은 것을 가지고 :3D 메쉬 2D 평면

that

을하지만 내 메쉬를 회전 할 때, 그것은 다음과 같이 :

this . 여기

This

내 코드입니다 :

은 어떻게해야입니다

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; 

수직 쉐이더 :

// 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. 

여기에 이벤트 핸들이 있고 난 내 메쉬를 회전하는 방법 :

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

파편 쉐이더 :

img1 img1

내가, 그것을 구글려고 "전형적인 실수에 대해 뭔가를 읽어 여기에

#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; 
} 

수잔 당신이 궁금해하는 경우처럼 보이게하는 방법입니다 "페이지 또는 stackoverflow 찾을 수 있지만 아무것도.

+1

vertex shader가 'MVP * temp'가 아니어야합니까? –

+2

@willywonkadailyblah가 맞습니다. 또한,'gl_Position = MVP * coord4d;'를'temp' 변수없이 쓸 수도 있습니다. –

+0

내 하나님 ... 그 해결책은 아주 간단했습니다. @willywonkadailyblah, 제발, 답변에 귀하의 의견을 써주세요, 그래서 나는 그것을 올바른 것으로 표시 할 수 있습니다. –

답변

2

버텍스 쉐이더는 MVP * temp이어야하며, 반대가 아닙니다. 실제 세계와 마찬가지로, GLSL 행렬 벡터 곱셈은 비 교환 적입니다 (이것은 사용자가 찾고있는 "일반적인 실수"입니다)