我在几个小时内一直遇到以下问题:
在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的颜色,我仍然愿意寻求解决方案:)