2016-06-21 21 views
-1

Ich versuche, dieses Modell in openGL zu machen:Rendering eines Modells in openGL

model in image viewer

das ist mein Versuch so weit:

model rendered by my code

Ich habe es die verticies nur Bisher keine Normalen oder Gesichter. Ich frage mich, warum es nicht wie das erste aussieht. Liegt es am Mangel an Normalen? Ich bin mir ziemlich sicher, dass ich die Anzahl der Vertices/Dreiecke richtig verstanden habe, aber ich bin mir nicht sicher, ob ich Fehler gemacht habe. Was ist der nächste Schritt, um das Modell wie das erste Bild vollständig zu rendern?

Puffer Erstellung:

//Vertex buffer 
GLuint vertexbuffer; 
glGenBuffers(1, &vertexbuffer); 
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer); 
glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW); 

//color buffer 
GLuint colorbuffer; 
glGenBuffers(1, &colorbuffer); 
glBindBuffer(GL_ARRAY_BUFFER, colorbuffer); 
glBufferData(GL_ARRAY_BUFFER, sizeof(g_color_buffer_data), g_color_buffer_data, GL_STATIC_DRAW); 

//create shaders and attach them to a program object 
GLuint program = rigShadersToProgram(); 

GLuint matrixID = glGetUniformLocation(program, "MVP"); 

rendering loop:

// Rendering loop 
while (!glfwWindowShouldClose(window)) 
{ 
    //clear the screen 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    ////////////////////////////matrix operations///////////////////////////////////////// 

    //projection matrix 45 degree FoV, 4:3 ratio, display range 0.1 - 100 
    glm::mat4 projection = glm::perspective(99.0f, 4.0f/3.0f, 0.1f, 100.0f); 

    //camera matrix 
    glm::mat4 view = glm::lookAt(
        glm::vec3(2, 1, -1), //camera is at (2,1,-1) 
        glm::vec3(0, 0 , 0), //looks at origin 
        glm::vec3(0,1, 0) //head is up 
        ); 

    //model matrix identity matrix 
    glm::mat4 model = glm::mat4(1.0f); 

    //rotate 
    model = glm::rotate(model, e, glm::vec3(1,2,3)); 


    //model-view-projection 
    glm::mat4 MVP = projection * view * model;  

    ////////////////////////////////////////////////////////////////////////////////////// 

    //use the compiled shaders 
    glUseProgram(program); 
    //send transformation matrix to currently bound shader 
    glUniformMatrix4fv(matrixID, 1, GL_FALSE, &MVP[0][0]); 

    glEnableVertexAttribArray(0); 
    glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer); 

    //vertex buffer 
    glVertexAttribPointer(
     0,   //index 
     3,   //size 
     GL_FLOAT, //type 
     GL_FALSE, //normalized? 
     0,   //stride 
     0   //array buffer offset 
    ); 

    glEnableVertexAttribArray(1); 
    glBindBuffer(GL_ARRAY_BUFFER, colorbuffer); 

    //color buffer 
    glVertexAttribPointer(
     1,   //index 
     3,   //size 
     GL_FLOAT, //type 
     GL_FALSE, //normalized? 
     0,   //stride 
     0   //array buffer offset 
    ); 

    //draw triangle 
    glDrawArrays(GL_TRIANGLES, 0, 12722*3); 

    std::cout << glfwGetTime() << "\n"; 

    glDisableVertexAttribArray(0); 
    glDisableVertexAttribArray(1); 

    glfwSwapBuffers(window); 
    glfwPollEvents(); 

die Modelldaten in einem Array gespeichert ist:

static const GLfloat g_vertex_buffer_data[] = { 

-1.557376f, 0.094970f, 0.171995f, 
-1.565967f, 0.098142f, 0.171995f, 
-1.557376f, 0.094970f, -0.048469f, 
-1.565967f, 0.098142f, -0.048469f, 
-1.532660f, 0.162907f, -0.048469f, 
-1.541251f, 0.166079f, -0.048469f, 
-1.444236f, 0.405840f, 0.171996f, 
-1.452827f, 0.409013f, 0.171996f, 
-1.463533f, 0.352575f, 0.171995f, 
-1.472257f, 0.355747f, 0.171995f, 
-1.528166f, 0.175331f, 0.011009f, 
-1.536757f, 0.178371f, 0.011009f, 
-1.538475f, 0.146781f, 0.025019f, ... etc 

Vertexshader:

#version 430 core             

layout(location =0) in vec3 vpos; 
layout(location =1) in vec3 vertexColor; 

out vec3 fragmentColor; 
uniform mat4 MVP; 

void main(void)              
{     
    //output position of the vertex in clip space MVP*position 
    gl_Position = MVP * vec4(vpos,1); 
    fragmentColor = vertexColor; 
};  

Fragment-Shader:

#version 430 core        

in vec3 fragmentColor; 

out vec3 color;        

void main()        
{            
    color = fragmentColor;   
};     
+0

Keine Lösung, aber eine Methode, um die Lösung zu erreichen: Reduzieren Sie Ihr Modell wenn möglich auf 1 Dreieck und sehen Sie, ob es sich als transparent herausstellt. Versuchen Sie, die Koordinaten dieses Dreiecks in eine andere Reihenfolge zu bringen (z. B. gegen den Uhrzeigersinn). Wie färben Sie die Oberfläche? Sind Sie sicher, dass Sie es nicht transparent machen? – Makketronix

Antwort

0

Sie zeigen nicht die tatsächlichen Modell Laden oder Rendering-Code. Aber was aus dem Screenshot Ihres Programms hervorgeht, ist, dass Ihre Vertex-Indexierungsreihenfolge völlig durcheinander ist. In der Zeichnung Ihres Programms sind Vertices miteinander verbunden, die definitiv nicht mit dem Modell verbunden sind. Zeit, den Code des Modellladeprogramms erneut zu prüfen.

BTW: Warum haben Sie die Anzahl der Scheitelpunkte festgeschrieben, um im glDrawArrays-Aufruf zu zeichnen? Das ergibt überhaupt keinen Sinn.

+0

Ich rendere nur ein Modell, warum ist es falsch, die Anzahl der Scheitelpunkte fest zu programmieren? – Andrewh

+0

Ich habe noch keinen Modelllader, ich habe die Eckendaten aus einer OBJ-Datei genommen und in ein Array eingefügt. – Andrewh

+0

@Andrewh: Wavefront OBJ-Dateien bestehen aus (mindestens) zwei Teilen: Eine Liste von Vertices. * Und eine Liste von Gesichtsdefinitionen! *. Wenn Sie die Faceliste nicht in einen flachen Vertex "stream" erweitert haben, müssen Sie 'glDrawElements' mit der Faceliste verwenden, die die Vertices indiziert. Die Rendering-Fehler in Ihrem zweiten Screenshot sind konsistent mit dem Senden einer einfachen OBJ-Vertex-Liste als Vertex-Stream unter Verwendung von 'glDrawArrays'. – datenwolf