Opengl ES 1.1 / Android - разгром текстуры на квадрат 2011 года - PullRequest
8 голосов
/ 16 мая 2011

Я пытаюсь нанести текстуру на квадрат, где текстура растягивается, чтобы соответствовать квадрату. В настоящее время текстуры отображаются, но они не отображаются в правильном местоположении, и OGL выполняет некоторые искажения или что-то подобное, что мне неизвестно. Изображение 64x64, а квадраты, которые я пробовал, имеют размеры от -2 до 2 (hor и ver) и от -1 до 1. Вот изображение:

enter image description here Код текстуры:


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();

и код для рендеринга:


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

И квадрат:


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

Я использую ортопедическую перспективу gl.glOrthof(-windowRatio, windowRatio, -1,1, -4, 4) , Я пробовал drawArrays (), который не имеет значения, а также использовал много комбинаций glTexParameter. Проблема кажется двоякой: (1) изображение не растягивается, и (2) только левый треугольник квадрата правильно отображает текстуру. Что-то, что я заметил, - то, что изменение координат текстуры не влияет на изображение. Как мне заставить это работать как задумано? Спасибо за поиск.

1 Ответ

4 голосов
/ 23 мая 2011

Вы используете GL_TEXTURE_COORD_ARRAY в качестве точки привязки буфера.Это просто неправильно.glTexCoordPointer получает данные из текущего GL_ARRAY_BUFFER, например glVertexPointer.Итак, в первой части замените

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

на

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

, а в коде рендеринга замените

gl11.glBindBuffer(GL11.GL_TEXTURE_COORD_ARRAY, textureCoordPointer);

на

gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, textureCoordPointer);

Это работает, потому что команды gl...Pointer получают свои данные из буфера, который связан с GL_ARRAY_BUFFER в момент их вызова.Так что просто выберите соответствующий буфер, затем вызовите gl...Pointer, и затем вы можете привязать другой буфер к GL_ARRAY_BUFFER (но буфер индекса должен быть привязан к GL_ELEMENT_ARRAY_BUFFER при вызове glDrawElements, конечно. Но, как уже упоминал Томмив комментарии вы также можете просто обойтись без тривиального индексного буфера и с glDrawArrays).

Таким образом, поскольку вызов glBindBuffer(GL_TEXTURE_COORD_ARRAY, ...) завершается неудачно (так как GL_TEXTURE_COORD_ARRAY не является допустимой точкой привязки), выиметь буфер вершин, все еще связанный при установке указателя texcoord.Но так как вы указываете, что у ваших вершин есть 3 компонента, а у ваших texcoords 2, вы фактически получаете { 1f, 1f, 0f, 1f, -1f, 0f, -1f, 1f } в качестве координат текстуры (первые восемь значений вашего массива вершин).Поэтому, когда вы представляете свой массив как

2   0

3   1

, вы получаете координаты текстуры:

-1,0   1,1

-1,1   0,1

После внесения предложенных изменений вы получите

1,0   0,0

1,1   0,1

текстура по-прежнему переворачивается по горизонтали и вертикали (я не знаю, предназначено ли это).Вы должны убедиться, что ваши текстовые координаты соответствуют вашим вершинам.Но после изменения вышеупомянутой ошибки в буфере она должна выглядеть как минимум немного лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...