2013-02-17 6 views
0

지금까지 deprecated 직접 모드 렌더링을 사용했는데 VAO와 VBO로 전환하려고합니다. 2D 쿼드는 일반적으로 VAO를 사용하여 렌더링되지만 질감을 첨부하려고하면 검은 색으로 유지됩니다. 누군가 내 코드를 살펴보고 내가 잘못한 부분을 지적 해 주시면 정말 감사하겠습니다.VAO를 사용하는 JOGL에서 텍스처가 검은 색입니다.

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는 (분명히) VAO 지원과 함께 OpenGL 4.3.0을 가지고 있다고보고합니다. 텍스처가있는 즉시 렌더링이 제대로 작동합니다.

나는 정말로 도움을 주실 것입니다. 미리 감사드립니다.

+0

질감에 검은 색 부분이 있습니까? 흰색 질감으로 시도하십시오. 흰색으로 바뀌면 당신의 문자 코드가 틀리거나 다른 것입니다. 너 색깔도 선택 했니? glColor()와 같은 것은 ... jogl을 모른다. – Rookie

+0

답변을 주셔서 감사합니다, 그것은 texcoords가 나쁘다는 것이 밝혀졌습니다. 짜임새로, 지금 백색이다. 답변을 답변으로 게시하면 승인 할 수 있습니다. – LugaidVandroiy

답변

1

텍스처 좌표를 확인하십시오.

그래도 효과가 없으면 버텍스 컬러를 흰색으로 설정했는지 확인하십시오 (텍스처에 나타나는 색상이 표시되도록).