VBO на Android: указание правильного изображения в буферах координат текстуры - PullRequest
1 голос
/ 10 февраля 2011

Кто-нибудь знает, как указать данный раздел массива текстурного буфера, хранящегося в буфере HW?Я рисую треугольную полосу и заполняю ее квадратным изображением.В моей текстуре у меня есть два квадратных изображения рядом друг с другом, так что буфер текстурных координат выделяет их в общей сложности 16 плаваниями.

С программными буферами Я делаю это дляполучить доступ ко второму изображению в текстуре:

textureCoordinateBuffer.position(8);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureCoordinateBuffer);

С аппаратными буферами Я предположил, что я делаю что-то вроде этого:

// setup HW buffers
// ...
// select HW buffers
gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER,vertexCoordinateBufferIndex);
gl11.glVertexPointer(3, GL10.GL_FLOAT, 0, 0);
gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, textureCoordinateBufferIndex);

// Point out the first image in the texture coordinate buffer
gl11.glTexCoordPointer(2, GL11.GL_FLOAT, 0, 0);
// Draw
// ...

Что работает хорошо, если вы хотитеукажите первое изображение в текстуре.Но я хотел бы получить доступ ко второму изображению - поэтому я предположил, что я делаю это в последней строке:

// Point out the second image in the texture coordinate buffer - doesn't work!
gl11.glTexCoordPointer(2, GL11.GL_FLOAT, 0, 8);

Но это приводит к искаженному и обесцвеченному изображению.

Любой, кто знает, какправильно ли это?

1 Ответ

3 голосов
/ 10 февраля 2011

Возможно, вы захотите взглянуть на руководства NeHe для Android. Они подробно расскажут об этом и покажут, что вам нужно делать.

В частности, урок, который вы ищете, здесь: http://insanitydesign.com/wp/projects/nehe-android-ports/

Урок 6

Возможно, вы не связываете и не включаете буферы, вот фрагмент из учебника:

public void draw(GL10 gl) {
        //Bind our only previously generated texture in this case
        gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);

        //Point to our buffers
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

        //Set the face rotation
        gl.glFrontFace(GL10.GL_CCW);

        //Enable the vertex and texture state
        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
        gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);

        //Draw the vertices as triangles, based on the Index Buffer information
        gl.glDrawElements(GL10.GL_TRIANGLES, indices.length, GL10.GL_UNSIGNED_BYTE, indexBuffer);

        //Disable the client state before leaving
        gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
        gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
    }

Кредит: Insanity Design - http://insanitydesign.com/

Edit: Я вижу, что вы спрашиваете. Вот еще код, который сможет вам помочь. Если вы посмотрите в приложение SpriteMethodTest для Android: http://apps -for-android.googlecode.com / SVN / багажник / SpriteMethodTest

Вы заметите, что Крис Пруэтт (разработчик этого приложения) показывает вам множество способов рисования текстур на экране. Ниже приведен код (я считаю), который вы ищете.

Grid.java

public void beginDrawingStrips(GL10 gl, boolean useTexture) {
        beginDrawing(gl, useTexture);
        if (!mUseHardwareBuffers) {
            gl.glVertexPointer(3, mCoordinateType, 0, mVertexBuffer);

            if (useTexture) {
                gl.glTexCoordPointer(2, mCoordinateType, 0, mTexCoordBuffer);
            } 

        } else {
            GL11 gl11 = (GL11)gl;
            // draw using hardware buffers
            gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, mVertBufferIndex);
            gl11.glVertexPointer(3, mCoordinateType, 0, 0);

            gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, mTextureCoordBufferIndex);
            gl11.glTexCoordPointer(2, mCoordinateType, 0, 0);

            gl11.glBindBuffer(GL11.GL_ELEMENT_ARRAY_BUFFER, mIndexBufferIndex);
        }
    }

    // Assumes beginDrawingStrips() has been called before this.
    public void drawStrip(GL10 gl, boolean useTexture, int startIndex, int indexCount) {
        int count = indexCount;
        if (startIndex + indexCount >= mIndexCount) {
                count = mIndexCount - startIndex;
        }
        if (!mUseHardwareBuffers) {
            gl.glDrawElements(GL10.GL_TRIANGLES, count,
                    GL10.GL_UNSIGNED_SHORT, mIndexBuffer.position(startIndex));
        } else {
                GL11 gl11 = (GL11)gl;
            gl11.glDrawElements(GL11.GL_TRIANGLES, count,
                    GL11.GL_UNSIGNED_SHORT, startIndex * CHAR_SIZE);

        }
    }

В частности, вы захотите взглянуть на код, где он принимает ложную ветвь! MUseHardwareBuffers. Я предлагаю вам взглянуть на полный файл Grid.java, чтобы лучше представить, как это сделать, потому что он также устанавливает указатели текстуры и позволяет OpenGL начать рисование.

На заметку: Я предлагаю прочитать это и от Криса: http://www.scribd.com/doc/16917369/Writing-Real-Time-Games-for-Android

Он рассказывает о том, что делает это приложение, и что он нашел самым эффективным способом рисования текстур.

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