LibGDX模型实例颜色未传递到Vertex Shader

时间:2018-12-29 14:15:55

标签: java opengl libgdx glsl shader

我在几个小时内一直遇到以下问题:

在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着色器,所以我真的不需要颜色,也不需要材质。相反,我将颜色声明为顶点着色器内的统一vec3。目前还可以,但不是我真正想要的。

所以如果有人知道,顶点着色器如何获得渲染的Renderable的颜色,我仍然愿意寻求解决方案:)

0 个答案:

没有答案