簡體   English   中英

使用VAO在JOGL中紋理為黑色

[英]Textures are black in JOGL using VAO

到目前為止,我已使用了不推薦使用的即時模式渲染,並且嘗試切換到VAO和VBO。 通常使用VAO渲染2D四邊形,但是當我嘗試附加紋理時,它保持黑色。 如果有人可以看一下我的代碼,並指出我做錯的部分,我將不勝感激。

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支持。 立即使用紋理渲染效果很好。

我真的很感謝任何幫助。 提前謝謝了。

檢查紋理坐標。

如果這不起作用,請檢查您是否將頂點顏色設置為白色(這樣它將顯示紋理中顯示的顏色)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM