在openGL中渲染模型

时间:2016-06-21 16:47:49

标签: c++ opengl model render

我试图在openGL中渲染这个模型:

model in image viewer

这是我到目前为止的尝试:

model rendered by my code

到目前为止,我只给了它顶点,没有法线或面孔。我想知道为什么它看起来不像第一个看起来那么完整。是因为缺乏法治吗?我很确定我得到了顶点/三角形的数量,但我不确定我是否犯了错误。像第一张图像一样完全渲染模型的下一步是什么?

缓冲区创建:

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

1 个答案:

答案 0 :(得分:0)

您不会显示实际的模型加载或渲染代码。但是从你的程序截图中可以清楚地看出,你的顶点索引顺序完全搞砸了。在程序的绘图中有一些顶点相互连接,这些顶点在模型中肯定没有连接。是时候重新检查模型加载器代码了。

BTW:你为什么要在glDrawArrays调用中硬编码要绘制的顶点数?这根本没有意义。