glDrawElements 具有每个刻面颜色
glDrawElements with per facet color
我正在使用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。我可以在每个顶点的着色器中有一个属性。如何添加每个刻面的颜色数据?
有三种不同的策略需要注意:
-
正确复制顶点数据。
-
使用
flat
插值限定符和挑衅顶点: 如果将变化限定为flat
,则不会跨基元对数据进行插值,但来自单个顶点的数据将用于整个基元。从中获取数据的顶点称为挑衅顶点,您可以通过glProvokingVertex()
在不同的约定之间进行选择。 如果您有顶点 A、B、C、D 和 E 以及三角形 ABC、BCD 和 CDE,并将每个顶点的颜色作为flat
转发到片段着色器,并使用例如使用GL_FIRST_VERTEX
约定,那么第一个三角形将获得 A 的颜色,第二个三角形将使用 B 的颜色,依此类推。此策略仅在一定程度上有效,不适用于任意网格,因为单个顶点可以连接到三个以上的三角形。这一战略仍可用于减少备选方案1中可能发生的重复数量。 -
将每面数据放入其他存储中,并使用
gl_PrimitiveID
片段着色器输入作为该存储的索引。根据所需的存储量(以及目标 GL 版本),统一缓冲区对象、纹理缓冲区对象或着色器存储缓冲区对象似乎是最合适的。
相关文章:
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 如何在内核C++中使用1920x1080x16M图形或类似的16M颜色?(VGA)
- 如何在24位SDL_Surface上设置像素的颜色
- 当我尝试使用 sstream 和分面将 Boost Time_duration转换为字符串时,我没有得到所需的格式
- 如何从SDL_Surface获取特定像素的颜色
- 列表视图更改选择颜色
- GtkTreeView 交替行颜色
- dx11 渲染到纹理仅显示透明颜色
- 使用 OpenGL 4.5 更改所选顶点的颜色
- 为什么我的 LEGACY OPENGL 颜色反转了?
- 双击更改 mfc 中列表控件中的行的颜色
- 使用 glvertex4i 传递网格面索引时的顶点着色器错误
- 更改 QT 中按钮的颜色
- 当我使用CHAR_INFO结构时,控制台会无缘无故地改变颜色
- 列表视图项的替代颜色
- GLSL 将 uint 转换为浮点颜色
- std::带有颜色和标题的 clog 包装器无法正确打印整数
- Vec3b:r/g/b 颜色的最大值为 254,而不是 255
- glDrawElements 具有每个刻面颜色
- cout 是否保证具有 ctype<char> 刻面?