Почему шейдер не работает в модуле html5, а работает в настольном приложении? - PullRequest
1 голос
/ 06 апреля 2019

После этого урока https://github.com/mattdesl/lwjgl-basics/wiki/LibGDX-Meshes-Lesson-1 при рендеринге мешей.Он отлично работает в настольном приложении, но развернул в html5 весь черный и спам:

.WebGL-000001FC218B3370] GL ОШИБКА: GL_INVALID_OPERATION: glDrawArrays: попытка доступа к вершинам диапазона в атрибуте 0

Почему это не работает?Я не использую массив в шейдере.

Я использую этот простой шейдер, который просто должен отображать положение и цвет вершины:

Вершинный шейдер

    //our attributes
attribute vec2 a_position;
attribute vec4 a_color;

//our camera matrix
uniform mat4 u_projTrans;

//send the color out to the fragment shader
varying vec4 vColor;

void main() {
    vColor = a_color;
    gl_Position = u_projTrans * vec4(a_position.xy, 0.0, 1.0);
}

Фрагмент шейдера

#ifdef GL_ES
precision mediump float;
#endif

//input from vertex shader
varying vec4 vColor;

void main() {
    gl_FragColor = vColor;
}

Рендеринг так

triangle.mesh.render(shaderProgram, GL20.GL_TRIANGLES, 0, 18 / NUM_COMPONENTS);

Редактировать

Моя спецификация вершин

public static final int MAX_TRIS = 1;
public static final int MAX_VERTS = MAX_TRIS * 3;

// ...

protected float[] verts = new float[MAX_VERTS * NUM_COMPONENTS];

mesh = new Mesh(true, MAX_VERTS, 0,
                    new VertexAttribute(VertexAttributes.Usage.Position, 2, "a_position"),
                    new VertexAttribute(VertexAttributes.Usage.ColorPacked, 4, "a_color"));

float c = color.toFloatBits();

idx = 0;

verts[idx++] = coordinates[0].x;
verts[idx++] = coordinates[0].y;
verts[idx++] = c;

//top left vertex
verts[idx++] = coordinates[1].x;
verts[idx++] = coordinates[1].y;
verts[idx++] = c;

//bottom right vertex
verts[idx++] = coordinates[2].x;
verts[idx++] = coordinates[2].y;
verts[idx++] = c;

mesh.setVertices(verts);

Мойрозыгрыш

public void render() {
        Gdx.gl.glDepthMask(false);
        Gdx.gl.glEnable(GL20.GL_BLEND);

        shaderProgram.begin();  // shaderprogram contains vertex and fragment shader
        shaderProgram.setUniformMatrix("u_projTrans", world.renderer.getCam().combined);
        for (Triangle triangle : triangles) {
            triangle.mesh.render(shaderProgram, GL20.GL_TRIANGLES, 0, 18 / NUM_COMPONENTS);

        }
        shaderProgram.end();
        Gdx.gl.glDepthMask(true);
    }

1 Ответ

1 голос
/ 06 апреля 2019

Сообщение об ошибке

.WebGL-000001FC218B3370] ОШИБКА GL: GL_INVALID_OPERATION: glDrawArrays: попытка доступа к вершинам диапазона вне атрибута 0

означает, что в буфере массива вершин недостаточно атрибутов вершины.
Это означает, что третий параметр count определяет больше вершин, чем это количество вершин в буфере.

Если у вас буфер вершин с 3 вершинами, то count должно быть 3, соответственно 9 / NUM_COMPONENTS, поскольку размер кортежа координаты вершины равен 3, а массив имеет размер 9 элементов. :

triangle.mesh.render(shaderProgram, GL20.GL_TRIANGLES, 0, 18 / NUM_COMPONENTS);
triangle.mesh.render(shaderProgram, GL20.GL_TRIANGLES, 0, 9 / NUM_COMPONENTS);

...