Шейдеры libgdx - базовый шейдер, но экран пуст

Я пытаюсь понять шейдеры, используя libgdx, исходя из фона XNA/HLSL. Я пытаюсь получить пару шейдеров vert/frag для воспроизведения вывода, полученного без шейдера, но он ничего не отображает.

Создание шейдера:

void SetupShader()
{
    ShaderProgram.pedantic = false;
    shader = new ShaderProgram(
            Gdx.files.internal("assets/default.vert").readString(),
            Gdx.files.internal("assets/default.frag").readString());
    if(!shader.isCompiled()) {
        Gdx.app.log("Problem loading shader:", shader.getLog());
    }
    batch.setShader(shader);
}

default.vert:

attribute vec4 a_Position;
attribute vec4 a_Normal;
attribute vec2 a_TexCoord;
attribute vec4 a_Color;

uniform mat4 u_projTrans;

varying vec2 v_texCoords;
varying vec4 v_color;

void main() {
    v_color = a_Color;
    v_texCoords = a_TexCoord;
    gl_Position = u_projTrans * a_Position;
}

default.frag:

#ifdef GL_ES
precision mediump float;
#endif

varying vec2 v_texCoords;
varying vec4 v_color;

void main() {
    gl_FragColor = v_color;
}

Rendering:

batch.begin();
for (GameObject gObj : gameObjects)
    gObj.Draw(batch);
batch.end();

Любые предложения здесь? Я также новичок в OpenGL-ES, поэтому я могу упустить что-то очевидное. Я немного осмотрелся перед публикацией, и документ для SpriteBatch.setShader(ShaderProgram) было следующим:

Устанавливает шейдер для использования в среде GLES 2.0. Атрибут положения вершины называется "a_position", атрибут координат текстуры называется "a_texCoords0", атрибут цвета называется "a_color". См. ShaderProgram.POSITION_ATTRIBUTE, ShaderProgram.COLOR_ATTRIBUTE и ShaderProgram.TEXCOORD_ATTRIBUTE, который получает "0", добавленный для обозначения использования первого текстурного блока. Матрица проекции загружается через униформу mat4, называемую "u_proj", матрица преобразования загружается через униформу, называемую "u_trans", объединенная матрица преобразования и проекции загружается через униформу mat4, называемую "u_projTrans". Сэмплер текстуры передается через униформу под названием "u_texture". Вызовите этот метод с нулевым аргументом, чтобы использовать шейдер по умолчанию.

1 ответ

Решение

Посмотрев на код в SpriteBatch кажется, у меня было несколько ошибок в моем коде. Ниже приведены правильные шейдеры:

default.vert:

attribute vec4 a_position;
attribute vec4 a_color;
attribute vec2 a_texCoord0;

uniform mat4 u_projTrans;

varying vec4 v_color;
varying vec2 v_texCoords;

void main() {
    v_color = a_color;
    v_texCoords = a_texCoord0;
    gl_Position = u_projTrans * a_position;
}

default.frag:

#ifdef GL_ES
    precision mediump float;
#endif

varying vec4 v_color;
varying vec2 v_texCoords;
uniform sampler2D u_texture;

void main() {
    gl_FragColor = v_color * texture2D(u_texture, v_texCoords);
}
Другие вопросы по тегам