【问题标题】:Interleaved Vertex Array Object doesn't show colors交错顶点数组对象不显示颜色
【发布时间】:2014-03-06 13:28:10
【问题描述】:

我正在尝试为每个顶点渲染一组具有自己颜色的顶点。顶点的数量大约是 1 mio,所以我使用顶点数组对象来渲染它们。 渲染点对我来说没有问题,但是当我将颜色添加到数据数组时,点仍然呈现为白色。我尝试了找到的不同教程,但它们都不适合我(例如:tut1tut2this)。

我将数据放在一个带有 VCVCVC 的数组中... 3 个浮点数用于顶点位置,4 个浮点数用于颜色。

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);

unsigned VAO_ID;
glGenVertexArrays(1, &VAO_ID);
glBindVertexArray(VAO_ID);

unsigned VBO_ID;
glGenBuffers(1, &VBO_ID);

glBindBuffer(GL_ARRAY_BUFFER, VBO_ID);
glBufferData(GL_ARRAY_BUFFER, vertex_count*7*4, vertices, GL_STATIC_DRAW);

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 7*4, 0);
glEnableVertexAttribArray(0);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 7*4, (char*)NULL + 3);
glEnableVertexAttribArray(1);

glVertexPointer(3, GL_FLOAT, 7*4, &vertices[0]);
glColorPointer(4, GL_FLOAT, 7*4, &vertices[3]);

glDrawArrays(GL_POINTS, 0, vertex_count);

我是 OpenGL 的新手,所以我可能犯了一个我看不到的愚蠢错误。

顺便说一句:即使使用数组中的颜色,顶点位置仍然正确

【问题讨论】:

  • 这个偏移量好像是错误的:(char*)NULL + 3);应该是字节-3*4
  • 我更改了偏移量,但这并没有改变任何东西。笑话是顶点的渲染是正确的,但它们都是白色的(我检查了颜色,它们在绿色/蓝色附近)。所以我想我定义了类似的颜色错误的位置。
  • 你用什么值来表示颜色,0..1?如何在片段着色器中应用颜色?
  • 我使用 0.0 到 1.0 范围内的值。而且我没有片段着色器,但我目前正在研究它。
  • 如果你没有片段着色器,那么着色器应该如何知道点应该是哪种颜色? ;)

标签: opengl vertex-array-object


【解决方案1】:

选择一种且只有一种的顶点提交方法:

  1. 顶点数组(VA):

    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_COLOR_ARRAY);
    
    glVertexPointer(3, GL_FLOAT, 7*4, &vertices[0]);
    glColorPointer(4, GL_FLOAT, 7*4, &vertices[3]);
    
    glDrawArrays(GL_POINTS, 0, vertex_count);
    
  2. 顶点缓冲对象(VBO):

    unsigned VBO_ID;
    glGenBuffers(1, &VBO_ID);
    glBindBuffer(GL_ARRAY_BUFFER, VBO_ID);
    glBufferData(GL_ARRAY_BUFFER, vertex_count*7*4, vertices, GL_STATIC_DRAW);
    
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_COLOR_ARRAY);
    
    glVertexPointer(3, GL_FLOAT, 7*4, 0);
    glColorPointer(4, GL_FLOAT, 7*4, (char*)NULL + 3);
    
    glDrawArrays(GL_POINTS, 0, vertex_count);
    
  3. 顶点数组对象(VAO)+ VBO(需要相应的着色器):

    unsigned VAO_ID;
    glGenVertexArrays(1, &VAO_ID);
    glBindVertexArray(VAO_ID);
    
    unsigned VBO_ID;
    glGenBuffers(1, &VBO_ID);
    glBindBuffer(GL_ARRAY_BUFFER, VBO_ID);
    glBufferData(GL_ARRAY_BUFFER, vertex_count*7*4, vertices, GL_STATIC_DRAW);
    
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 7*4, 0);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 7*4, (char*)NULL + 3);
    glEnableVertexAttribArray(1);
    

【讨论】:

    【解决方案2】:

    你需要创建两个顶点缓冲对象(VBO)

    目前只创建了一个,但您尝试访问两个

    // Create one VAO
    GLuint VertexArrayID;
    glGenVertexArrays(1, &VertexArrayID);
    glBindVertexArray(VertexArrayID);
    
    // This will identify our vertex buffer
    GLuint vertexbuffer;
    
    // Generate 1 buffer, put the resulting identifier in vertexbuffer
    glGenBuffers(1, &vertexbuffer);
    
    // The following commands will talk about our 'vertexbuffer' buffer
    glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
    
    // Give our vertices to OpenGL.
    glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW);
    
    // Now repeat for a colour 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);
    
    // just before rendering
    // 1st attribute buffer : vertices
    glEnableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
    glVertexAttribPointer(
       0,                  // attribute 0. No particular reason for 0, but must match the layout in the shader.
       3,                  // size
       GL_FLOAT,           // type
       GL_FALSE,           // normalized?
       0,                  // stride
       (void*)0            // array buffer offset
    );
    
    // 2nd attribute buffer : colors
    glEnableVertexAttribArray(1);
    glBindBuffer(GL_ARRAY_BUFFER, colorbuffer);
    glVertexAttribPointer(
        1,                                // attribute. No particular reason for 1, but must match the layout in the shader.
        3,                                // size
        GL_FLOAT,                         // type
        GL_FALSE,                         // normalized?
        0,                                // stride
        (void*)0                          // array buffer offset
    );
    
    // Draw triangles etc
    

    g_vertex_buffer_datag_color_buffer_data 是要使用的数据数组,您可能需要设置一些着色器代码并且仍然必须添加渲染代码,但这是如何拥有多个 VBO(纹理坐标,颜色,法线等)

    【讨论】:

    • 我注意到这似乎是 OpenGL ES 而不是核心配置文件。我的解决方案针对核心配置文件,您确实需要多个缓冲区(每个状态一个)但只有一个顶点数组
    • 我试过你的方法,但我只得到白色顶点(颜色是!=白色,我检查一下)。
    • 你在使用着色器还是什么?
    • 不,我使用 freeglut 创建一个窗口,仅此而已。我只是想画一些点,但这似乎比我想象的要难。
    • 这个 tut 很好,可以帮到你opengl-tutorial.org/beginners-tutorials/…
    猜你喜欢
    • 1970-01-01
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    • 2021-03-23
    • 1970-01-01
    • 2021-09-24
    相关资源
    最近更新 更多