2016-06-21 6 views
-1

でモデルをレンダリングこれまでのところ、法線や顔はありません。私はそれが最初のもののように完全に見えない理由が不思議です。法線がないためですか?私はかなり頂点/三角形の数を得ていると確信していますが、私が間違いを犯したかどうかはわかりません。最初のイメージのようにモデルを完全にレンダリングする次のステップは何ですか?は、私はOpenGLでこのモデルをレンダリングしようとしているOpenGLの

バッファの作成:

//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 
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(); 

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 

頂点シェーダ:

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

フラグメントシェーダ:

#version 430 core        

in vec3 fragmentColor; 

out vec3 color;        

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

解決策ではありませんが、解決策に到達する方法:可能であればモデルを1つの三角形に縮小し、透明であるかどうかを確認します。その三角形の座標を異なる順序(例えば反時計回り)に配置してみてください。また、表面をどのように着色していますか?それを透明にしていないと確信していますか? – Makketronix

答えて

0

あなたは、実際のモデルの読み込みやレンダリングコードを示していません。しかし、あなたのプログラムのスクリーンショットから明らかなことは、あなたの頂点インデックスの順序が完全に乱れていることです。プログラムの図面には、モデル内では接続されていない頂点があります。モデルローダーコードを再チェックする時間。

ところで、なぜあなたはglDrawArraysコールで描画する頂点の数をハードコードしましたか?それはまったく意味がありません。

+0

私は1つのモデルをレンダリングするだけです。なぜ、頂点の数をハードコードするのは間違っていますか? – Andrewh

+0

私はまだモデルローダーを持っていません。OBJファイルから頂点データを取り出して配列に入れました。 – Andrewh

+0

@Andrewh:Wavefront OBJファイルは、(少なくとも)2つの部分で構成されています:頂点のリスト。 *と顔の定義のリスト!*。フェイスリストをフラットな頂点の "ストリーム"に展開しない限り、フェイスリストで頂点をインデックス付けして 'glDrawElements'を使用する必要があります。 2番目のスクリーンショットのレンダリングの破損は、 'glDrawArrays'を使用してプレーンOBJ頂点リストを頂点ストリームとして送信することと一貫しています。 – datenwolf

関連する問題