Некорректное отображение текстуры на прямоугольник в Open GL ES - PullRequest
0 голосов
/ 10 февраля 2019

Вершины моего прямоугольника определены следующим образом:

0------1
|      |
|      |
2------3

Этот прямоугольник моделируется двумя следующими треугольниками: 0,2,3 и 0,3,1.

Этот списокзатем из шести вершин сопоставляются координаты текстуры следующим образом:

0.0f,0.0f
0.0f,1.0f
1.0f,1.0f
0.0f,0.0f
1.0f,1.0f
1.0f,0.0f

Но текстура неправильно сопоставлена ​​...

У меня есть изображение текстуры:

enter image description here

и результат, который я получаю на экране:

enter image description here

Кто-нибудь видит, гдеЯ запутался?

Способ передачи текстуры в Open GL:

    pointeurSurTexture = GLES31.glGetUniformLocation(programme, "texture");
    pointeurSurCoordonnéesTexture = GLES31.glGetAttribLocation(programme, "coordonneesTexture");

    GLES31.glActiveTexture(GLES31.GL_TEXTURE0);
    GLES31.glBindTexture(GLES31.GL_TEXTURE_2D, pointeursSurTextures[0]);
    GLES31.glUniform1i(pointeurSurTexture, 0);
    GLES31.glVertexAttribPointer(pointeurSurCoordonnéesTexture, NB_COORDONNEES_PAR_POINT_TEXTURE2D,
            GLES31.GL_FLOAT, false,NB_COORDONNEES_PAR_POINT_TEXTURE2D*OCTETS_PAR_FLOAT,
            tableauCoordonnéesTextures);
    GLES31.glEnableVertexAttribArray(pointeurSurCoordonnéesTexture);

и мой фрагментный шейдер:

        precision mediump float;
        uniform sampler2D texture;
        varying vec4 couleurSommet;
        varying vec2 coordonneeTexture;
        void main() {
            gl_FragColor = couleurSommet *  texture2D(texture,coordonneeTexture);
        };

И как я рисую своютреугольники:

GLES31.glDrawElements(GL_TRIANGLES, triangles.capacity(),GL_UNSIGNED_SHORT, triangles);

Массив triangles содержит координату треугольника, выраженную в виде индексов вершин (например, 0,2,3,0,3,1).

1 Ответ

0 голосов
/ 10 февраля 2019

Когда вы вызываете glDrawElements, тогда координаты вершины ищутся по индексам в массиве индексов элементов.
Но все остальные атрибуты, такие как координаты текстуры, также ищутся.

Вы определили 4 координаты вершины, которые образуют четырехугольник с шириной w и высотой h:

0------1
|      |
|      |
2------3
   x  y
0: 0  0
1: w  0
2: 0  h
3: w  h

Четыре квадратанарисованный 2 треугольниками

Этот прямоугольник моделируется с двумя следующими треугольниками: 0,2,3 и 0,3,1.

[...]

GLES31.glDrawElements(GL_TRIANGLES, triangles.capacity(),GL_UNSIGNED_SHORT, triangles);

Массив треугольников содержит координату треугольника, выраженную в виде индексов вершин (например, 0,2,3,0,3,1).

Итак, вы настроили массив из 4 вершинкоординаты и массив из 6 индексов.

Если вы хотите добавить координаты текстуры, то вам нужно связать каждую координату вершины с соответствующей координатой текстуры, а не с каждым элементом массива индекса!
Числокоординаты вершины и координаты текстуры должны быть равны, но не количество атрибутов координат текстуры и количество элементов в массиве индексов.

Координаты вершины и текстура и ее атрибуты (в данном случае координаты текстуры) образуют набор данных.Вы можете рассматривать 2-мерные координаты вершины (x, y) и 2-мерные координаты текстуры как одну 4-мерную координату.

   x  y  u  v
0: 0  0  0  0
1: w  0  1  0
2: 0  h  0  1
3: w  h  1  1

Это означает, что атрибут "texture" должен быть связан с массивом из 4 координат текстуры в следующем порядке:

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