Вопрос

So far, I used the deprecated immediate mode rendering, and I'm trying to switch to VAO then VBO. 2D quads are normally rendered using VAO, but when I'm trying to attach a texture, it remains black. I would really appreciate if somebody could take a look at my code, and point out the part where I'm wrong.

public class CSpriteVAO {
/*VAO*/
private FloatBuffer vertices;
private ShortBuffer indices;
private FloatBuffer textures;
private int VAOVertices;
private int VAOIndices;
private int VAOTextures;

/*SPRITE*/
private String mTexture;
private CPoint mPosition;
private CPoint mDimension;
private CPreferences mPreferences;

public CSpriteVAO(GL2 gl, CPreferences preferences, String spriteID, CRectangle dimensions){
    mPreferences = preferences;
    mTexture = spriteID;
    mDimension = new CPoint(dimensions.width, dimensions.height);
    mPosition = new CPoint(dimensions.x, dimensions.y);

    CCreateVAO(gl);
}

public void onDraw(GL2 gl){
    gl.glLoadIdentity();
    CBindTexture(gl);
    CDraw(gl);
}

private void CDraw(GL2 gl){
    //gl.glCullFace(GL2.GL_CW);
    gl.glTranslatef(mPosition.x, mPosition.y, 0);
    gl.glEnableClientState(GL2.GL_VERTEX_ARRAY);
    gl.glEnableClientState(GL2.GL_TEXTURE_COORD_ARRAY);
        gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, VAOVertices);
        gl.glVertexPointer(3, GL2.GL_FLOAT, 0, 0);

        gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, VAOTextures);
        gl.glTexCoordPointer(2, GL2.GL_FLOAT, 0, VAOTextures);

        gl.glBindBuffer(GL2.GL_ELEMENT_ARRAY_BUFFER, VAOIndices);
        gl.glDrawElements(GL2.GL_TRIANGLES, indices.capacity(), GL2.GL_UNSIGNED_SHORT, 0);

    gl.glDisableClientState(GL2.GL_TEXTURE_COORD_ARRAY);
    gl.glDisableClientState(GL2.GL_VERTEX_ARRAY);
}

private void CCreateVAO(GL2 gl){
    //float[] textureArray = {0f, 1f, 1f, 1f, 1f, 0f, 0f, 0f};
    float[] textureArray = {0f, 0f, 1f, 0f, 1f, 1f, 0f, 1f};
    textures = Buffers.newDirectFloatBuffer(textureArray.length);
    textures.put(textureArray);
    textures.flip();

    float[] vertexArray = {0,            mDimension.y, 0,
                           mDimension.x, mDimension.y, 0,
                           mDimension.x, 0,            0,
                           0,            0,            0};
    vertices = Buffers.newDirectFloatBuffer(vertexArray.length);
    vertices.put(vertexArray);
    vertices.flip();

    short[] indexArray = {0, 1, 2, 0, 2, 3};
    indices = Buffers.newDirectShortBuffer(indexArray.length);
    indices.put(indexArray);
    indices.flip();

    int[] temp = new int[3];
    gl.glGenBuffers(3, temp, 0);

    VAOTextures = temp[0];
    gl.glBindBuffer(GL2.GL_ELEMENT_ARRAY_BUFFER, VAOTextures);
    gl.glBufferData(GL2.GL_ELEMENT_ARRAY_BUFFER, textures.capacity() * Buffers.SIZEOF_FLOAT, textures, GL2.GL_STATIC_DRAW);
    gl.glBindBuffer(GL2.GL_ELEMENT_ARRAY_BUFFER, 0);

    VAOVertices = temp[1];
    gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, VAOVertices);
    gl.glBufferData(GL2.GL_ARRAY_BUFFER, vertices.capacity() * Buffers.SIZEOF_FLOAT, vertices, GL2.GL_STATIC_DRAW);
    gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, 0);

    VAOIndices = temp[2];
    gl.glBindBuffer(GL2.GL_ELEMENT_ARRAY_BUFFER, VAOIndices);
    gl.glBufferData(GL2.GL_ELEMENT_ARRAY_BUFFER, indices.capacity() * Buffers.SIZEOF_SHORT,  indices, GL2.GL_STATIC_DRAW);
    gl.glBindBuffer(GL2.GL_ELEMENT_ARRAY_BUFFER, 0);
}

protected void CBindTexture(GL2 gl){
    if (mTexture != CUtils.CurrentTexture){
        if (mTexture != null){
            CAssets.CWGGetTexture(mTexture).enable(gl);
            CAssets.CWGGetTexture(mTexture).bind(gl);
        }
        CUtils.CurrentTexture = mTexture;
    }
}
}

For the record: my vcard reports to have OpenGl 4.3.0 with (obviously) VAO support. Immediate rendering with textures is working fine.

I would really appreciate any kind of help. Many thanks in advance.

Это было полезно?

Решение

Check your texture coordinates.

If that does not work, check that you have set vertex color to white (so it will display colors as they show in the texture).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top