使用GL_TRIANGLE_STRIP进行四边形绘制

4
我正在尝试在OpenGL中使用LWJGL从一个包含所有字符的纹理图集中绘制字符串。
现在,我要为每个字符添加三个顶点到网格中,该网格将由渲染。
GL11.glDrawArrays(GL11.GL_TRIANGLE_STRIP, 0, text.getModel().getRawModel().getVertexCount());

例如,我正在尝试呈现字符串“Thomas”,结果如下(添加偏移量以更好地查看问题):

Render of Thomas

正如您所看到的,每个字符之间都有一个奇怪的“quad”,我不知道为什么:-( 我认为我对每个字符添加了太多的顶点,但我不知道如何更好地处理它...

顶点(2D):

-0.3333333, 0.5875, 
-0.24800003, 0.5875, 
-0.3333333, 0.25, 
-0.24800003, 0.25, 

-0.11466664, 0.5875, 
-0.029333353, 0.5875, 
-0.11466664, 0.25, 
-0.029333353, 0.25, 

0.10399997, 0.5875, 
0.18933332, 0.5875, 
0.10399997, 0.25, 
0.18933332, 0.25, 

0.32266665, 0.5875, 
0.408, 0.5875, 
0.32266665, 0.25, 
0.408, 0.25, 

0.5413333, 0.5875, 
0.62666667, 0.5875, 
0.5413333, 0.25, 
0.62666667, 0.25, 

0.76, 0.5875, 
0.84533334, 0.5875, 
0.76, 0.25, 
0.84533334, 0.25,

纹理坐标(2D):
0.23318386, 1.0, 
0.23766816, 1.0, 
0.23318386, 0.0, 
0.23766816, 0.0, 

0.32286996, 1.0, 
0.32735425, 1.0, 
0.32286996, 0.0, 
0.32735425, 0.0, 

0.3542601, 1.0, 
0.35874438, 1.0, 
0.3542601, 0.0, 
0.35874438, 0.0, 

0.34529147, 1.0, 
0.3497758, 1.0, 
0.34529147, 0.0, 
0.3497758, 0.0, 

0.29147983, 1.0, 
0.29596412, 1.0, 
0.29147983, 0.0, 
0.29596412, 0.0, 

0.3721973, 1.0, 
0.37668163, 1.0, 
0.3721973, 0.0, 
0.37668163, 0.0 

什么是索引数组? - rwols
1
@rwols,没有索引数组,因为我认为不会重复使用任何顶点。只有顶点和纹理坐标存储在VAO中。 - Thomas Flynn
那么 GL_TRIANGLE_STRIP 可能不适用。 - rwols
2个回答

2

从你放置顶点的方式来看,GL_TRIANGLE_STRIP 是不适用的。让我们用数字 0 到 24 标记你的顶点。三角形带拓扑结构会绘制如下三角形:

draw triangle 0 1 2
draw triangle 1 2 3
draw triangle 2 3 4
...
draw triangle 20 21 22
draw triangle 21 22 23

你可能需要的是这个:

您可能需要的是这个:

draw triangle 0 1 2
draw triangle 1 2 3

draw triangle 4 5 6
draw triangle 5 6 7

draw triangle 8 9 10
draw triangle 9 10 11

...
...

draw triangle 20 21 22
draw triangle 21 22 23

这可以通过使用GL_TRIANGLES拓扑结构和以下方式的索引缓冲来实现:
[ 0 1 2 1 2 3 4 5 6 5 6 7 ... 20 21 22 21 22 23 ]

1
非常感谢!就这样 :-) - Thomas Flynn

2

如果您想使用TRIANGLE_STRIP渲染不相交的图元,您需要在不相交的图元之间包含退化(零面积)三角形。您可以通过重复要使其不相交的顶点来实现此操作:

-0.3333333, 0.5875, 
-0.24800003, 0.5875, 
-0.3333333, 0.25,  // real triangle
-0.24800003, 0.25, // real triangle
-0.24800003, 0.25, // ignored degenerate triangle

-0.11466664, 0.5875,  // ignored degenerate triangle
-0.11466664, 0.5875,  // ignored degenerate triangle
-0.029333353, 0.5875, // ignored degenerate triangle
-0.11466664, 0.25,    // real triangle
-0.029333353, 0.25,   // real triangle
-0.029333353, 0.25,   // ignored degenerate triangle
...

简化版的prims已经被优化得足够好了,因此您可以忽略它们。

但是请注意,对于呈现不连续四边形来说基本上没有优势,因为与使用TRIANGLES相比,无论四边形数量如何,您只能总共节省两个顶点。

当不连续的“跳跃”较少时,例如面向tri-strip-optimized meshes时,该技术更有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接