2013-02-17 2 views
0

До сих пор я использовал рендеринг немедленного режима, и я пытаюсь перейти на VAO, затем VBO. 2D-квады обычно отображаются с использованием VAO, но когда я пытаюсь прикрепить текстуру, она остается черной. Я был бы очень признателен, если бы кто-нибудь мог взглянуть на мой код и указать на ту часть, где я ошибаюсь.Текстуры черные в JOGL с использованием VAO

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; 
    } 
} 
} 

Для записи: мой протокол vcard имеет OpenGl 4.3.0 с (очевидно) поддержкой VAO. Непосредственный рендеринг с текстурами работает нормально.

Я бы очень признателен за любую помощь. Спасибо заранее.

+0

У вашей текстуры есть черные области? попробуйте с белой текстурой. если он изменится на белый, то ваши texcoords ошибочны или что-то еще. Вы тоже выбрали цвет? как glColor() я имею в виду ... я не знаю jogl. – Rookie

+0

Спасибо за ответ, оказалось, что мои texcoords плохие. С текстурой теперь она белая. Если вы опубликуете свой ответ в качестве ответа, я могу его одобрить. – LugaidVandroiy

ответ

1

Проверьте координаты текстуры.

Если это не сработает, убедитесь, что вы установили цвет вершин в белый (чтобы он отображал цвета, как они показывают в текстуре).

 Смежные вопросы

  • Нет связанных вопросов^_^