Цвет экземпляра модели LibGDX не передается в Vertex Shader - PullRequest
0 голосов
/ 29 декабря 2018

Я застрял со следующей проблемой на пару часов:

В LibGDX я хочу визуализировать ModelInstance с помощью пользовательского шейдера, например:

modelBatch.render(modelInstance, shader);

Относительношейдер, я вызываю

shader = new CustomShader();
shader.init();

в методе игры create ().

Класс CustomShader выглядит следующим образом (сокращено до больших методов):

public class CustomShader implements Shader {

    ShaderProgram shaderProgram;
    Camera camera;
    RenderContext renderContext;

    @Override
    public void init() {

        shaderProgram = new ShaderProgram(
                Gdx.files.internal("core/assets/Shaders/VertexShader.glsl").readString(),
                Gdx.files.internal("core/assets/Shaders/FragmentShader.glsl").readString()
        );

        if (!shaderProgram.isCompiled()) {

            throw new GdxRuntimeException("Shader program inside water shader is not compiled yet:\n" + shaderProgram.getLog());
        }

        System.out.println("Shader compiled successfully");

        ShaderProgram.pedantic = false;
    }

    @Override
    public void begin(Camera camera, RenderContext renderContext) {

        this.camera = camera;
        this.renderContext = renderContext;

        shaderProgram.begin();
        shaderProgram.setUniformMatrix("u_projViewTrans", camera.combined);
    }

    @Override
    public void render(Renderable renderable) {

        shaderProgram.setUniformMatrix("u_worldTrans", renderable.worldTransform);
        renderable.meshPart.render(shaderProgram);
    }
}

Для вершинного шейдера я скопировал некоторый код, который должен быть простым сквозным шейдером:

attribute vec3 a_position;
attribute vec4 a_color;

uniform mat4 u_worldTrans;
uniform mat4 u_projViewTrans;

varying vec4 v_color;

void main() {

    v_color = a_color;

    gl_Position = u_projViewTrans * u_worldTrans * vec4(a_position, 1.0);
}

Дело в том, что ModelInstance (создается ли с помощью вызова createBox илисоздавая его три за три с помощью ModelBuilder, он всегда отображается ровно красным.

Фрагментный шейдер, похоже, не является проблемой;если я жестко закодирую v_color внутри вершинного шейдера, как

v_color = vec4(0, 1, 0, 1);

, то модель будет отображаться зеленым, как и должно быть.

Чего я не могу добиться, так это модели, отображаемой в цвете, определяемом еематериал.Кажется, что Java-код не передает цвет вершинному шейдеру.

Было бы здорово, если бы кто-то из вас знал ответ;Я борюсь с этой проблемой целую вечность.

Заранее спасибо!

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

Поскольку мне нужен только шейдер для ModelInstances ofединственная модель, которая имеет только один базовый цвет, мне не нужен ни цвет, ни материал.Вместо этого я объявляю цвет как равномерный vec3 внутри вершинного шейдера.На данный момент это работает, но это не то, чего я действительно хочу.

Так что, если кто-нибудь знает, как вершинный шейдер может получить цвет отрендеренного Renderable, я все еще открыт для решений :)

...