【问题标题】:android/ openGL cube with GL_TRIANGLE_FAN带有 GL_TRIANGLE_FAN 的 android/openGL 多维数据集
【发布时间】:2011-10-22 23:59:18
【问题描述】:

我是 openGL ES 的一些新手,我想构建一个简单的多维数据集,但似乎在让我想要 4 个不同的 TRIANGLE_FAN 的索引字节缓冲区时遇到一些问题,我将如何去做/重写我的代码:

public class GLCube{

private float vertices[] = {
    1, 1, -1, //p0 - topFrontRight
    1, -1, -1, //p1 bottomFront Right
    -1, -1, -1, //p2 bottom front left
    -1, 1, -1, //p3 front top left
    1, 1, 1, //p4 - topBackRight
    1, -1, 1, //p5 bottomBack Right
    -1, -1, 1, //p6 bottom back left
    -1, 1, 1, //p7 front back left
};

private FloatBuffer vertBuff;

private short[] pIndex = { 
        0, 4, 1, 3, //i0 fan of top front right
        5, 4, 1, 6, //i1 fan from bottom right back
        2, 1, 3, 6, //i2 fan from bottom left front
        7, 3, 4, 6 //i3 fan from top left back
};

private ShortBuffer pBuff;

public GLCube(){

    ByteBuffer bBuff = ByteBuffer.allocateDirect(vertices.length * 4);
    bBuff.order(ByteOrder.nativeOrder());
    vertBuff = bBuff.asFloatBuffer();
    vertBuff.put(vertices);
    vertBuff.position(0);


    ByteBuffer pbBuff = ByteBuffer.allocateDirect(pIndex.length * 2);
    pbBuff.order(ByteOrder.nativeOrder());
    pBuff = pbBuff.asShortBuffer();
    pBuff.put(pIndex);
    pBuff.position(0);
}

public void draw(GL10 gl){
    gl.glFrontFace(GL10.GL_CW);
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertBuff);
    gl.glDrawElements(GL10.GL_TRIANGLE_FAN, pIndex.length, GL10.GL_UNSIGNED_SHORT, pBuff);
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);

}
}

我假设您必须使用 GL10.GL_PRIMITIVE_RESTART,但是对于 android,我认为这不存在...

【问题讨论】:

    标签: opengl-es cube indices


    【解决方案1】:

    您的假设是正确的,如果没有 primitive_restart 扩展,您无法在一次调用 glDrawElements 时渲染多个三角形风扇。你可以做的是使用glMultiDrawElements,你可以在一次调用中绘制多个图元,但它的使用有点麻烦,我不确定它是否真的给你带来了单个三角形列表的性能优势(尤其是这个简单的立方体)。

    我给您的一般提示是,远离复杂的基元,如三角带和扇形,因为它们仅用于一些特殊的小几何形状(无论如何,您不会获得任何性能优势)。更大的通用网格需要更多的努力才能真正从这些原始类型中获得优势(如果有的话)。只需使用一个简单的索引三角形列表就可以了。

    顺便说一句,如果你真的想要一个“复杂”的立方体镶嵌,你可以从一个三角形条带构建一个立方体,但解决方案取决于你或谷歌。

    编辑:刚刚查看了 GLES 规范,似乎 glMultiDraw... 函数已在 ES 中删除。因此,没有办法绕过单个索引三角形列表(或三角形条解决方案),至少如果您想在一次调用中绘制立方体,这是可取的。

    【讨论】:

    • 嗨克里斯蒂安,非常感谢您的回复!就像我说的,我对 OpenGL 还很陌生,您的深思熟虑的回答帮了大忙。再次感谢
    • @user848162 如果有帮助,我们将不胜感激。
    • 我真的认为这是因为风扇的使用非常有限,并且在使用即时模式时手动编程形状时它们最有用(glBegin() / glEnd())。这可以解释为什么微软stripped out triangle fans in D3D10
    猜你喜欢
    • 1970-01-01
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    • 2020-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多