Нужна помощь в понимании glDrawElements для GLES 2.0 - PullRequest
1 голос
/ 28 января 2012

Я пытаюсь изучить OpenGL ES 2.0 для Android, но мне трудно найти хорошие вводные руководства ... Я нашел Это , но оно объясняет только "glDrawArrays", а не "glDrawElements"«... я пытаюсь преобразовать код из моей модели загрузки класса ES 1.1, но я чувствую, что рисование массивов может быть слишком медленным ...

Итак, я спрашиваю, как мне преобразоватьдля работы в ES 2.0?

Как хранится объект (кажется, что все в порядке):

    private ShortBuffer SindexBuffer;
private FloatBuffer SvertexBuffer;
private FloatBuffer StexBuffer;

private void initSprite()
{
    float[] fcol = {1,1,1,1};
    float[] coords = {
            0.5f, 0.5f, 0f,
            -0.5f, 0.5f, 0f,
            0.5f, -0.5f, 0f,
            -0.5f, -0.5f, 0f
            };
    short[] index = {
            0,1,2,
            1,3,2
            };
    float[] texCoords ={
            0,1,
            1,1,
            0,0,
            1,0
        };

    //float has 4 bytes
    ByteBuffer vbb = ByteBuffer.allocateDirect(coords.length * 4);
    vbb.order(ByteOrder.nativeOrder());
    SvertexBuffer = vbb.asFloatBuffer();

    ByteBuffer tC = ByteBuffer.allocateDirect(texCoords.length * 4);
    tC.order(ByteOrder.nativeOrder());
    StexBuffer = tC.asFloatBuffer();
    StexBuffer.put(texCoords);
    StexBuffer.position(0);

    //short has 2 bytes
    ByteBuffer ibb = ByteBuffer.allocateDirect(index.length*2);
    ibb.order(ByteOrder.nativeOrder());
    SindexBuffer = ibb.asShortBuffer();

    SvertexBuffer.put(coords);
    SindexBuffer.put(index);

    SvertexBuffer.position(0);
    SindexBuffer.position(0);

    ByteBuffer fbb = ByteBuffer.allocateDirect(fcol.length * 4);
    fbb.order(ByteOrder.nativeOrder());
}

И как он рисуется (вот где мне нужна помощь):

        public void drawSprite(GL10 gl, int tex)
    {
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
        gl.glBindTexture(GL10.GL_TEXTURE_2D, tex);      
        //defines the vertices we want to draw
        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, SvertexBuffer);
        gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, StexBuffer);

        //Draw the vertices
        gl.glDrawElements(GL10.GL_TRIANGLES,  6, GL10.GL_UNSIGNED_SHORT,  SindexBuffer);
        gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
        gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
    }

(хотя текстурная часть еще не так важна ... пока не до этого).

Спасибо всем, кто может помочь ... о, и кто-нибудь знает что-нибудьпростое введение в ES 2.0 для Android, предназначенное для людей, которые сначала использовали 1.1?

1 Ответ

1 голос
/ 20 апреля 2012

Переведите как это

 float[] coords = {
        0.5f, 0.5f, 0f,        //index 0
        -0.5f, 0.5f, 0f,       //index 1 
        0.5f, -0.5f, 0f,       //index 2
        -0.5f, -0.5f, 0f       //index 3
}     

И вы говорите opengl, что график использует эту последовательность точек:

0, 1, 2, 1, 3, 2.

Здесь вы экономите память, потому что индексы имеют короткий тип, и каждой вершине нужно 3 числа с плавающей запятой

С уважением

...