每个facet颜色的glDrawElements

时间:2018-03-20 18:35:50

标签: c++ qt opengl

我使用glDrawElements绘制索引网格:

voi

d init()
    {
//allocate vbo, copy actual data (m_indices,m_vertices).
//m_indices is a vector of mx3 indices of the facet.
//m_vertices is nx6 xyzrgb vertex points
     m_vBuff.create();
     m_iBuff.create();

 m_vBuff.setUsagePattern(QOpenGLBuffer::StaticDraw);
 m_iBuff.setUsagePattern(QOpenGLBuffer::StaticDraw);

 m_vBuff.bind();
 m_vBuff.allocate(m_vertices.data(), int(m_vertices.size() * sizeof(VertData)));
 m_vBuff.release();

 m_iBuff.bind();
 m_iBuff.allocate(m_indices.data(), int(m_indices.size() * sizeof(uint32_t)));
 m_iBuff.release();
}

和用法:

    ...
     m_vBuff.bind();
     m_iBuff.bind();
//define attribute which can be used in the shader
        int vp = shader->attributeLocation("a_xyz");
        shader->enableAttributeArray(vp);
        shader->setAttributeBuffer(vp, GL_FLOAT, 0, 3, sizeof(VertData));


        int vc = shader->attributeLocation("a_rgb");
        shader->enableAttributeArray(vc);
        shader->setAttributeBuffer(vc, GL_FLOAT, 3 * sizeof(float), 3, sizeof(VertData));


    glDrawElements(GL_TRIANGLES, m_iBuff.size() / sizeof(uint32_t), GL_UNSIGNED_INT, NULL);

    m_vBuff.release();
    m_iBuff.release();

m_vBuff中的数据是有组织的。我可以在着色器每个顶点中有一个属性。如何添加每个方面的颜色数据?

1 个答案:

答案 0 :(得分:3)

  

m_vBuff中的数据是有组织的。我可以在着色器每个顶点中有一个属性。如何添加每个方面的颜色数据?

有三种不同的策略可供选择:

  1. 正确复制顶点数据。

  2. 使用flat插值限定符并激发顶点: 如果您将变化限定为flat,则不会在基元上插入数据,但是来自单个顶点的数据将用于整个基元。从中获取数据的顶点称为引发顶点,您可以通过glProvokingVertex()在不同的约定之间进行选择。如果您有顶点A,B,C,D和E以及三角形ABC,BCD和CDE,并将每顶点颜色转发到片段着色器flat,并使用例如{{1约定,然后第一个三角形将获得A的颜色,第二个三角形将使用B&#39的颜色,依此类推。此策略仅在某种程度上起作用,而不适用于任意网格,因为单个顶点可以连接到三个以上的三角形。此策略仍可用于减少选项1中可能出现的重复数量。

  3. 将per-face数据放入其他存储中,并使用gl_PrimitiveID片段着色器输入作为该存储的索引。根据您需要的存储量(以及您要定位的GL版本),Uniform Buffer ObjectTexture Buffer ObjectShader Storage Buffer Object似乎最合适。