我使用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
中的数据是有组织的。我可以在着色器每个顶点中有一个属性。如何添加每个方面的颜色数据?
答案 0 :(得分:3)
m_vBuff
中的数据是有组织的。我可以在着色器每个顶点中有一个属性。如何添加每个方面的颜色数据?
有三种不同的策略可供选择:
正确复制顶点数据。
使用flat
插值限定符并激发顶点:
如果您将变化限定为flat
,则不会在基元上插入数据,但是来自单个顶点的数据将用于整个基元。从中获取数据的顶点称为引发顶点,您可以通过glProvokingVertex()
在不同的约定之间进行选择。如果您有顶点A,B,C,D和E以及三角形ABC,BCD和CDE,并将每顶点颜色转发到片段着色器flat
,并使用例如{{1约定,然后第一个三角形将获得A的颜色,第二个三角形将使用B&#39的颜色,依此类推。此策略仅在某种程度上起作用,而不适用于任意网格,因为单个顶点可以连接到三个以上的三角形。此策略仍可用于减少选项1中可能出现的重复数量。
将per-face数据放入其他存储中,并使用gl_PrimitiveID
片段着色器输入作为该存储的索引。根据您需要的存储量(以及您要定位的GL版本),Uniform Buffer Object,Texture Buffer Object或Shader Storage Buffer Object似乎最合适。