До сих пор я использовал рендеринг немедленного режима, и я пытаюсь перейти на 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. Непосредственный рендеринг с текстурами работает нормально.
Я бы очень признателен за любую помощь. Спасибо заранее.
У вашей текстуры есть черные области? попробуйте с белой текстурой. если он изменится на белый, то ваши texcoords ошибочны или что-то еще. Вы тоже выбрали цвет? как glColor() я имею в виду ... я не знаю jogl. – Rookie
Спасибо за ответ, оказалось, что мои texcoords плохие. С текстурой теперь она белая. Если вы опубликуете свой ответ в качестве ответа, я могу его одобрить. – LugaidVandroiy