使用 GL_TRIANGLE_STRIP 绘制四边形
Quad drawing with GL_TRIANGLE_STRIP
我正在尝试使用 LWJGL 在 OpenGL 中从包含所有相邻字符的纹理图集中绘制一个字符串。
现在我为每个字符添加三个顶点到网格,这将由
渲染
GL11.glDrawArrays(GL11.GL_TRIANGLE_STRIP, 0, text.getModel().getRawModel().getVertexCount());
例如,我正在尝试渲染字符串 "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
看看您如何布置顶点,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 ]
如果您想使用 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
...
退化的棱镜被优化得足够好,你可以忽略它们。
但是请注意,这对于渲染不相交的四边形基本上没有优势,因为与仅使用 TRIANGLES
相比,您总共只保存了两个顶点,而不管四边形的数量如何。
这种技术在不相交 'jumps' 不太常见时更有用,例如三条带优化的网格。
我正在尝试使用 LWJGL 在 OpenGL 中从包含所有相邻字符的纹理图集中绘制一个字符串。
现在我为每个字符添加三个顶点到网格,这将由
渲染GL11.glDrawArrays(GL11.GL_TRIANGLE_STRIP, 0, text.getModel().getRawModel().getVertexCount());
例如,我正在尝试渲染字符串 "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
看看您如何布置顶点,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 ]
如果您想使用 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
...
退化的棱镜被优化得足够好,你可以忽略它们。
但是请注意,这对于渲染不相交的四边形基本上没有优势,因为与仅使用 TRIANGLES
相比,您总共只保存了两个顶点,而不管四边形的数量如何。
这种技术在不相交 'jumps' 不太常见时更有用,例如三条带优化的网格。