Opengl ES 1.1 / Android - La debacle del mapeo de texturas a un cuadrado de 2011

Estoy tratando de mapear una textura en un cuadrado donde la textura se estira para ajustarse al cuadrado. Actualmente, la textura se asigna, pero no se asigna a la ubicación correcta y OGL realiza un sesgo o algo que no sé. La imagen es de 64x64 y los cuadrados que he probado son de -2 a 2 (hor y ver) y -1 a 1. Aquí está la imagen:

enter image description here El código de textura es:


float texture[] = { 0,0,0,1, 1,0,1,1 };
ByteBuffer byteBuf = ByteBuffer.allocateDirect(texture.length * 4);
byteBuf.order(ByteOrder.nativeOrder());
FloatBuffer textureBuffer = byteBuf.asFloatBuffer();
textureBuffer.put(texture);
textureBuffer.flip();
int[] buffer = new int[1];
gl11.glGenBuffers(1, buffer, 0);
textureCoordPointer = buffer[0];
gl11.glBindBuffer(GL11.GL_TEXTURE_COORD_ARRAY, textureCoordPointer);
gl11.glBufferData(GL11.GL_TEXTURE_COORD_ARRAY, textureBuffer.capacity() 
   * 4, textureBuffer, GL11.GL_STATIC_DRAW);
gl11.glBindBuffer(GL11.GL_TEXTURE_COORD_ARRAY, 0);
Bitmap bitmap = BitmapFactory.decodeResource(context
   .getResources(),R.drawable.afd);
int textures[] = new int[1];
gl.glGenTextures(1, textures, 0);
texturePointer = textures[0];
gl.glBindTexture(GL10.GL_TEXTURE_2D, texturePointer);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
bitmap.recycle();

y el código para la representación es:


gl11.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, vertexPointerSquare);
gl11.glVertexPointer(3, GL10.GL_FLOAT, 0, 0);       
gl11.glBindBuffer(GL11.GL_ELEMENT_ARRAY_BUFFER, indexPointerSquare);
gl.glBindTexture(GL10.GL_TEXTURE_2D, texturePointer);
gl11.glBindBuffer(GL11.GL_TEXTURE_COORD_ARRAY, textureCoordPointer);
gl11.glTexCoordPointer(2, GL10.GL_FLOAT, 0, 0);

gl11.glPushMatrix();
gl11.glScalef(.4f,.4f,0);
gl11.glColor4f(1,1,1,1);
gl11.glDrawElements(GL11.GL_TRIANGLE_STRIP, indicesSquare, 
   GL11.GL_UNSIGNED_SHORT, 0);
gl11.glPopMatrix();
gl.glBindTexture(GL10.GL_TEXTURE_2D, 0);

Y la plaza:


GL11 gl11 = (GL11) gl;
FloatBuffer vertexSquareBuffer = ByteBuffer.allocateDirect(verticesSquare * 3 * 4)
.order(ByteOrder.nativeOrder()).asFloatBuffer();

ShortBuffer indexSquareBuffer = ByteBuffer.allocateDirect(indicesSquare * 2)
.order(ByteOrder.nativeOrder()).asShortBuffer();

float vertices[] = { 1f, 1f, 0, 1f, -1f, 0, -1f, 1f, 0, -1f, -1f, 0 };
short indices[] = { 0, 1, 2, 3 };
vertexSquareBuffer.put(vertices);
indexSquareBuffer.put(indices);
indexSquareBuffer.flip();
vertexSquareBuffer.flip();
int[] bufferSquare = new int[1];
gl11.glGenBuffers(1, bufferSquare, 0);
vertexPointerSquare = bufferSquare[0];
gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, vertexPointerSquare);
gl11.glBufferData(GL11.GL_ARRAY_BUFFER, vertexSquareBuffer.capacity() * 4,
    vertexSquareBuffer, GL11.GL_STATIC_DRAW);
gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, 0);
gl11.glGenBuffers(1, bufferSquare, 0);
indexPointerSquare = bufferSquare[0];
gl11.glBindBuffer(GL11.GL_ELEMENT_ARRAY_BUFFER, indexPointerSquare);
gl11.glBufferData(GL11.GL_ELEMENT_ARRAY_BUFFER, indexSquareBuffer.capacity() * 2,
    indexSquareBuffer, GL11.GL_STATIC_DRAW);

Estoy usando una perspectiva ortodoxa gl.glOrthof(-windowRatio, windowRatio, -1,1, -4, 4) . Probé drawArrays (), que no hace ninguna diferencia, y también utilicé muchas combinaciones de glTexParameter. El problema parece doble: (1) la imagen no se estira para ajustarse y (2) solo el triángulo izquierdo del cuadrado representa correctamente la textura. Algo que he notado es que cambiar las coordenadas de la textura no tiene ningún efecto en la imagen. ¿Cómo hago para que esto funcione según lo previsto? Gracias por mirar.

preguntado el 16 de mayo de 11 a las 17:05

A partir de las imágenes, su cuadrado se divide en 2 triángulos diferentes asignaciones para el triángulo superior derecho e inferior izquierdo. La parte superior derecha está sesgada. -

Probablemente no ayude, pero ¿hay alguna posibilidad de publicar la configuración para indexPointerSquare y vertexPointerSquare? Como observación de estilo no relacionada: puede volcar indexPointerSquare y simplemente usar glDrawArrays. -

1 Respuestas

Tu usas GL_TEXTURE_COORD_ARRAY como punto de unión del búfer. Eso está mal. La glTexCoordPointer obtiene sus datos de la corriente GL_ARRAY_BUFFER, como el glVertexPointer. Así que en tu primera parte sustituye

gl11.glBindBuffer(GL11.GL_TEXTURE_COORD_ARRAY, textureCoordPointer);
gl11.glBufferData(GL11.GL_TEXTURE_COORD_ARRAY, textureBuffer.capacity() 
   * 4, textureBuffer, GL11.GL_STATIC_DRAW);
gl11.glBindBuffer(GL11.GL_TEXTURE_COORD_ARRAY, 0);

by

gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, textureCoordPointer);
gl11.glBufferData(GL11.GL_ARRAY_BUFFER, textureBuffer.capacity() 
   * 4, textureBuffer, GL11.GL_STATIC_DRAW);
gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, 0);

y en el código de representación sustituto

gl11.glBindBuffer(GL11.GL_TEXTURE_COORD_ARRAY, textureCoordPointer);

by

gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, textureCoordPointer);

Esto funciona porque el gl...Pointer Los comandos toman sus datos del búfer que está vinculado a GL_ARRAY_BUFFER por el momento se les llama. Así que simplemente seleccione el búfer apropiado, luego llame gl...Pointer y luego puede vincular otro búfer a GL_ARRAY_BUFFER (pero el búfer de índice debe estar vinculado a GL_ELEMENT_ARRAY_BUFFER al llamar glDrawElements, por supuesto. Pero como Tommy ya mencionó en un comentario, también podría ir sin el búfer de índice trivial y con glDrawArrays).

Entonces, como la llamada a glBindBuffer(GL_TEXTURE_COORD_ARRAY, ...) falla (como GL_TEXTURE_COORD_ARRAY no es un punto de enlace válido), el búfer de vértice todavía está vinculado al configurar el puntero de texcoord. Pero como especificas que tus vértices tengan 3 componentes y tus texcoords 2, en realidad obtienes { 1f, 1f, 0f, 1f, -1f, 0f, -1f, 1f } como coordenadas de textura (los primeros ocho valores de su matriz de vértices). Entonces, como renderiza su matriz como

2   0

3   1

obtienes como coords de textura:

-1,0   1,1

-1,1   0,1

Después de realizar los cambios propuestos, obtendrá

1,0   0,0

1,1   0,1

Entonces, su textura todavía se voltea horizontal y verticalmente (no sé si eso es lo que se pretendía). Tienes que asegurarte de que tus coordenadas textuales coincidan con tus vértices. Pero después de cambiar el error de búfer mencionado anteriormente, al menos debería verse un poco mejor.

contestado el 23 de mayo de 11 a las 01:05

Bien merecido +50. Eso solucionó el problema y agradezco la explicación detallada. - avestruz de granja

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.