OpenGL ES 2.0 Android рисование текстурированных треугольников - PullRequest
0 голосов
/ 29 января 2020

У меня есть книга "OpenGL ES 2 для Android Краткое руководство", и она проходит хорошее руководство по OpenGL и android. Проблема, с которой я сталкиваюсь, заключается в том, что в примерах не используются индексные буферы для создания их фигур.

Я пытаюсь текстурировать квадрат, который я определяю 4 вершинами квадрата (плюс координата S и T координаты для текстур), а затем визуализировать с использованием индексного буфера. Однако у меня цвет квадрата - только нижний левый угол файла текстуры PNG, и он не отображается правильно на моем квадрате.

Это моя функция рендеринга:

 public void onDrawFrame(float[] matrixViewProjection)
    {
        super.onDrawFrame(matrixViewProjection);

        GLES20.glUseProgram(this.shaderProgram);
        int posHandle = GLES20.glGetAttribLocation(shaderProgram,"vPosition");
        GLES20.glEnableVertexAttribArray(posHandle);

        GLES20.glVertexAttribPointer(posHandle,coordsPerVertex,GLES20.GL_FLOAT,false,vertexStride,vertexBuffer);

        int colHandle = GLES20.glGetUniformLocation(shaderProgram,"vColor");
        GLES20.glUniform4fv(colHandle,1,color,0);

        int mvpHandle = GLES20.glGetUniformLocation(shaderProgram,"uMVPMatrix");
        GLES20.glUniformMatrix4fv(mvpHandle,1,false,matrixSum,0);

        GLES20.glDrawElements(GLES20.GL_TRIANGLES,indexBufferCount,GLES20.GL_UNSIGNED_SHORT,drawListBuffer);
        GLES20.glDisableVertexAttribArray(posHandle);
    }

И это мой конструктор для моего квадратного объекта:

 public ShapeSquare(Context context, int program, float size)
    {
        float squareCoords[] = {
                -(size/2.0f),-(size/2.0f),0f, 0f, 0f,
                -(size/2.0f), (size/2.0f),0f, 0f, 1f,
                 (size/2.0f), (size/2.0f),0f, 1f, 1f,
                 (size/2.0f),-(size/2.0f),0f, 0f, 0f
        };

        short drawOrder[] = {0,1,3,1,2,3};

        indexBufferCount = drawOrder.length;

        ByteBuffer bb = ByteBuffer.allocateDirect(squareCoords.length*4);
        bb.order(ByteOrder.nativeOrder());

        vertexBuffer = bb.asFloatBuffer();
        vertexBuffer.put(squareCoords);
        vertexBuffer.position(0);

        ByteBuffer dlb = ByteBuffer.allocateDirect(drawOrder.length*2);
        dlb.order(ByteOrder.nativeOrder());
        drawListBuffer = dlb.asShortBuffer();
        drawListBuffer.put(drawOrder);
        drawListBuffer.position(0);

        shaderProgram = program;

        shaderProgram = program;

        textureID = TextureHelper.loadTexture(context, R.raw.texture1);
    }

И вот некоторые из определений, которые у меня есть, хотя я не знаю, верны ли они

    protected static int coordsPerVertex = 3;
    protected int vertexCount = 12/coordsPerVertex;
    protected static final int vertexStride = coordsPerVertex*4+8;

Здесь это то, что отображается ... enter image description here

И это текстура, которую я имею. (Обратите внимание на левый нижний угол) enter image description here

1 Ответ

0 голосов
/ 29 января 2020

Вы должны указать 2 массива данных атрибута вершины (glVertexAttribPointer). 1 для координат вершины и 1 для координат текстуры:

int posHandle = GLES20.glGetAttribLocation(shaderProgram, "vPosition");
int texHandle = GLES20.glGetAttribLocation(shaderProgram, ???);

GLES20.glEnableVertexAttribArray(posHandle);
GLES20.glEnableVertexAttribArray(texHandle );

vertexBuffer.position(0);       
GLES20.glVertexAttribPointer(posHandle, coordsPerVertex, GLES20.GL_FLOAT, false,
                             vertexStride, vertexBuffer);

vertexBuffer.position(3);        
GLES20.glVertexAttribPointer(texHandle, coordsPerVertex, GLES20.GL_FLOAT, false,
                             vertexStride, vertexBuffer);

Обратите внимание, что vertexBuffer содержит кортежи из 5 элементов (x, y, z, u, v). Шаг в байтах 5 * 4. Смещение координат вершины равно 0, а смещение координат текстуры равно 3 * 4 соответственно 3 элементам в плавающем буфере.

Поскольку вы не используете Объекты буфера вершин , вам следует предпочитают создавать отдельные массивы (соответственно плавающие буферы) для атрибутов.

...