在libgdx中,我加载了一个着色器,我想让我的Stage对象使用该着色器进行绘制。我尝试将SpriteBatch的着色器设置为我的着色器,然后将舞台的精灵批量设置为该着色器,但它显示为黑屏。为什么这不起作用:
ShaderProgram shader = new ShaderProgram(Gdx.files.internal("shader.vert"), Gdx.files.internal("shader.frag"));
SpriteBatch batch = new SpriteBatch();
batch.setShader(shader);
Stage stage = new Stage(new StretchViewport(768, 576), batch);
...
stage.act();
shader.begin();
stage.draw();
shader.end();
我的着色器看起来像:
attribute vec4 a_position;
attribute vec4 a_color;
attribute vec2 a_texCoord;
uniform mat4 u_projTrans;
varying vec4 v_color;
varying vec2 v_texCoords;
void main()
{
v_color = a_color;
v_color.a = v_color.a * (256.0/255.0);
v_texCoords = a_texCoord + 0;
gl_Position = u_projTrans * a_position;
}
#ifdef GL_ES
#define LOWP lowp
precision mediump float;
#else
#define LOWP
#endif
varying LOWP vec4 v_color;
varying vec2 v_texCoords;
uniform sampler2D u_texture;
void main()
{
gl_FragColor = v_color * texture2D(u_texture, v_texCoords);
}
它似乎只适用于一个纹理。每个其他纹理都不会渲染。而且,使纹理能力为2并没有什么不同。
答案 0 :(得分:0)
SpriteBatch具有某些预期的属性名称。您正在使用a_texCoord
,但它需要a_texCoord0
,因此着色器会将所有UV处理为0,0。
你提到在SpriteBatch和舞台上的SpriteBatch上设置着色器,但在你的代码中,它们是同一个。
您不需要在着色器上调用begin
和end
,因为SpriteBatch(以及Stage)会自动执行此操作。我不确定这是否会导致问题。
我无法解释为什么你所做的会对你的一个纹理起作用。我希望它只是将所有内容绘制为与纹理的左下角像素相同的颜色。
可能还有其他问题,但我假设它在您插入自己的着色器之前正确绘制。