glDrawElements 具有每个刻面颜色

glDrawElements with per facet color

本文关键字:刻面 颜色 glDrawElements      更新时间:2023-10-16

我正在使用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中的数据是有组织的 S.T.我可以在每个顶点的着色器中有一个属性。如何添加每个刻面的颜色数据?

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

有三种不同的策略需要注意:

  1. 正确复制顶点数据。

  2. 使用flat插值限定符和挑衅顶点: 如果将变化限定为flat,则不会跨基元对数据进行插值,但来自单个顶点的数据将用于整个基元。从中获取数据的顶点称为挑衅顶点,您可以通过glProvokingVertex()在不同的约定之间进行选择。 如果您有顶点 A、B、C、D 和 E 以及三角形 ABC、BCD 和 CDE,并将每个顶点的颜色作为flat转发到片段着色器,并使用例如使用GL_FIRST_VERTEX约定,那么第一个三角形将获得 A 的颜色,第二个三角形将使用 B 的颜色,依此类推。此策略仅在一定程度上有效,不适用于任意网格,因为单个顶点可以连接到三个以上的三角形。这一战略仍可用于减少备选方案1中可能发生的重复数量。

  3. 将每面数据放入其他存储中,并使用gl_PrimitiveID片段着色器输入作为该存储的索引。根据所需的存储量(以及目标 GL 版本),统一缓冲区对象、纹理缓冲区对象或着色器存储缓冲区对象似乎是最合适的。