Android / OpenGL куб с GL_TRIANGLE_FAN - PullRequest
       19

Android / OpenGL куб с GL_TRIANGLE_FAN

3 голосов
/ 09 августа 2011

Я новичок в 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 я не думаю, что это существует ...

1 Ответ

3 голосов
/ 09 августа 2011

Вы правы в своем предположении, без расширения primitive_restart вы не можете рендерить несколько треугольников в одном вызове на glDrawElements. То, что вы можете сделать, это использовать glMultiDrawElements, где вы можете нарисовать несколько примитивов за один вызов, но его использование немного громоздко, и я не уверен, дает ли это действительно преимущество в производительности по сравнению с одним списком треугольников (особенно с этим простой куб).

Общий совет, который я бы вам дал, состоит в том, чтобы держаться подальше от сложных примитивов, таких как треугольные полосы и вентиляторы, потому что они используются только для некоторых особых небольших геометрий (тех, где вы не получите никакого выигрыша в производительности, в любом случае). Большие общие сетки требуют гораздо больше усилий, чтобы действительно получить преимущество от этих примитивных типов, если таковые имеются. Просто используйте простой индексированный список треугольников, и все в порядке.

Кстати, если вы действительно хотите «изощренную» тесселяцию куба, вы можете построить куб из одной треугольной полоски, но решение для вас - вы или Google.

EDIT: Только что посмотрел спецификацию GLES, и кажется, что функции glMultiDraw... были удалены в ES. Таким образом, нет способа обойти один индексированный список треугольников (или решение с полосками треугольников), по крайней мере, если вы хотите нарисовать куб за один вызов, что желательно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...