gpt4 book ai didi

OpenGL/JOGL : Multiple triangle fans in a vertex array

转载 作者:行者123 更新时间:2023-12-04 01:53:02 26 4
gpt4 key购买 nike

我正在使用顶点数组制作一些相对简单的形状,并且取得了一些不错的进展,但现在我想绘制 2 个(或更多)三角形扇形对象。有没有办法只打一个电话到gl.glDrawArrays(GL.GL_TRIANGLE_FAN,...还是我需要为每个粉丝单独打电话?

维基百科的Triangle strip文章描述了一种叫做原始重启的东西,但是 OpenGL 的 Vertex Specification让我觉得这不适用于顶点数组。

绘制多个三角扇的正确方法是什么?这是我当前的绘制方法:

public void draw(GL gl){
if(vertices.length == 0)
return;

gl.glEnableClientState(GL.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL.GL_COLOR_ARRAY);
gl.glEnableClientState(GL.GL_NORMAL_ARRAY);

gl.glVertexPointer(3, GL.GL_FLOAT, 0, vertBuff);
gl.glColorPointer(3, GL.GL_FLOAT, 0, colorBuff);
gl.glNormalPointer(GL.GL_FLOAT,0, normalBuff);

// drawArrays count is num of points, not indices.
gl.glDrawArrays(GL.GL_TRIANGLES, 0, triangleCount);
gl.glDrawArrays(GL.GL_QUADS, triangleCount, quadCount);
gl.glDrawArrays(GL.GL_TRIANGLE_FAN, triangleCount+quadCount, fanCount);

gl.glDisableClientState(GL.GL_VERTEX_ARRAY);
gl.glDisableClientState(GL.GL_COLOR_ARRAY);
gl.glDisableClientState(GL.GL_NORMAL_ARRAY);
}

编辑

我更新了 draw 的相关部分,如下所示:
    for(int i = 0; i < fanLength.length; i++){
gl.glDrawArrays(GL.GL_TRIANGLE_FAN,
triangleCount+quadCount+fanDist[i], fanLength[i]);
}

其中 fanDist 是这个扇形起点的偏移量(从扇形的起点开始),而 fanLength 是这个扇形的长度。

这似乎确实有效,这很好,但是,这是正确的方法吗?有没有更好的办法?

最佳答案

原始重启确实适用于顶点数组和顶点缓冲区 - 如果不这样做,它就不会真正有用。

但是,与 glDrawArrays 结合使用确实没有用。 .

让我们看看两种技术:

原语重启

介绍一下glDrawElements给你:一个电话

glDrawArrays(mode, 0, 5);

类似于
GLuint idxs[] = {0, 1, 2, 3, 4}; // C code, but idea's the same in Java
glDrawElements(mode, 5, GL_UNSIGNED_INT, idxs);

所以不要指定 范围 要从数组中提取的元素个数,您指定 精确指数 那些元素。

然后你可以通过使用这样的数组来引入原始重启:
GLuint PRIMITIVE_RESTART = 12345; // magic value

glEnable(GL_PRIMITIVE_RESTART);
glPrimitiveRestartIndex(PRIMITIVE_RESTART);
GLuint idxs[] = {0, 1, 2, 3, PRIMITIVE_RESTART, 4, 5, 6, 7};
glDrawElements(mode, 9, GL_UNSIGNED_INT, idxs);

这将从前 4 个顶点绘制一个扇形,然后会遇到“符号”重新启动图元,然后它将绘制最后 4 个顶点的另一个扇形。

传递给 DrawElements 的索引不必是连续的范围! 它们可以按任何顺序排列,并且可以根据需要重复 - 这是此功能的全部最佳部分。事实上,最好尽可能多地重用一个索引,因为如果结果被缓存,它只会被顶点着色器处理一次。所以你可以自由地制作像这样的缓冲区:
GLuint idxs[] = {0, 6, 3, 4, 6, 2, PRIMITIVE_RESTART, 2, 6, 3, 3, 5, 2}; // etc.

多画元素

在您的情况下,您可能想要使用 glMultiDrawElements反而。

如果你有,比如说,20个顶点,你想从第一个开始画一个8个顶点的扇形,从第10个开始画一个10个顶点的扇形,你可以这样做:
// assuming glVertexPointer is already set
GLuint startingElements[] = {0, 9};
GLuint counts[] = {8, 10};
glMultiDrawArrays(GL_TRIANGLE_FAN, startingElements, counts, 2); // 2 fans

因此,您要做的工作会少一些。

选择您认为更有用的技术。我会让你用 Java/JOGL 重写它,原理是一样的,但你必须使用 Buffer我猜是为所有这些上的课。

关于OpenGL/JOGL : Multiple triangle fans in a vertex array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4386861/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com