2016-07-29 3 views
0

Wenn ich versuche, mein Netz zu ziehen, habe ich so etwas wie diese:3D-Netz zu 2D-Ebene projiziert

that

Aber wenn ich meine Masche drehen, sieht es so:

this .

Dies ist, wie es sein sollte: mein Code

This

Hier:

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

Hier Ereignis handelte und wie ich drehe meine Masche:

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; 

Vert-Shader :

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

Frag Shader:

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

Hier ist, wie Suzanne aussehen, wenn Sie sich fragen:

img1 img1

Ich habe versucht, es zu Google, lesen Sie etwas über es auf „typische Fehler "Seite oder finden Sie auf Stackoverflow, aber nichts.

+1

Sollte nicht der vert Shader 'MVP * temp' sein? –

+2

@willywonkadailyblah hat Recht. Sie könnten auch 'gl_Position = MVP * coord4d;' ohne die 'temp'-Variable schreiben. –

+0

Mein Gott ... Die Lösung war ziemlich einfach. @willywonkadailyblah, bitte, schreibe deinen Kommentar als Antwort, damit ich ihn als richtig markieren kann. –

Antwort

2

Der Vertex Shader sollte MVP * temp sein, nicht umgekehrt. Genau wie in der realen Welt, in GLSL Matrix-Vektor-Multiplikation ist nicht-kommutativen (das wäre der "typische Fehler" Sie gesucht)

Verwandte Themen