【发布时间】:2018-08-14 16:52:41
【问题描述】:
我有一个提供 3D 网格的现有系统。提供的数据是一个顶点坐标数组,包含 3 个分量(x、y、z)和一个索引列表。
问题是索引列表是四元组的连续数组。
系统必须首先使用核心配置文件OpenGL Context 运行,然后再使用 OpenGL ES 3.x。
我知道所有四边形的绕组顺序都相同(逆时针),但我没有关于四边形的更多信息。我对他们的关系或邻接关系一无所知。
由于我想使用核心配置文件Context 进行渲染,我不能使用GL_QUAD 原始类型。我必须将四边形转换为三角形。
当然,四边形索引数组可以很容易地转换为三角形索引数组:
std::vector<unsigned int> triangles;
triangles.reserve( no_of_indices * 6 / 4 );
for ( int i = 0; i < no_of_indices; i += 4 )
{
int tri[] = { quad[i], quad[i+1], quad[i+2], quad[i], quad[i+2], quad[i+3] };
triangles.insert(triangles.end(), tri, tri+6 );
}
如果必须只执行一次,那么这就是解决方案。但是网格数据不是静态的。数据可以动态变化。 数据不会每次都连续变化,而是变化莫测,随机变化。
另一个简单的解决方案是创建一个顶点数组对象,它直接引用一个带有四边形的元素数组缓冲区,并使用GL_TRIANGLE_FAN 原始类型将它们绘制在一个循环中:
for ( int i = 0; i < no_of_indices; i += 4 )
glDrawElements( GL_TRIANGLE_FAN, 4, GL_UNSIGNED_INT, (void*)(sizeof(unsigned int) * 4) );
但我希望有更好的解决方案。我正在寻找一种可能性,可以通过一次绘制调用绘制四边形,或者在 GPU 上将四边形转换为三角形。
【问题讨论】:
-
"由于我想使用顶点缓冲区和顶点数组对象进行渲染,所以我不能使用 GL_QUAD 原始类型。" 这是放弃
GL_QUADS的核心配置文件。如果您愿意使用兼容性配置文件,那么您可以随心所欲地使用它们。
标签: opengl glsl shader triangulation