Libgdx着色器在舞台?

问题描述:

在libgdx中,我加载了一个着色器,并且想让我的Stage对象使用该着色器进行绘制。我试着将SpriteBatch的着色器设置为我的着色器,然后将Stage的Sprite批量设置为该批次,但它显示为黑屏。为什么不这项工作:Libgdx着色器在舞台?

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(); 

我着色器看起来像:

shader.vert

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; 
} 

shader.frag

#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并没有什么区别。

SpriteBatch具有某些预期的属性名称。您正在使用a_texCoord,但它预计为a_texCoord0,所以着色器会将所有UV视为0,0。

你提到了在SpriteBatch和Stage的SpriteBatch上设置着色器,但在你的代码中,它们是一样的。

您不需要在着色器上调用beginend,因为SpriteBatch(因此Stage)会自动执行此操作。我不确定这是否会导致问题。

我无法解释你为什么会用你的纹理工作。我希望它只是画出与纹理左下角像素相同的颜色。

可能还有其他问题正在进行,但我假设它在插入自己的着色器之前绘图正确。

+0

首先,我的代码与我所提到的相同,但我错误地写了它,我猜。开始和结束没有任何区别,当我删除它们,但我会尝试改变它到a_texCoord0 – name 2014-09-28 02:09:27

+0

是啊改变'a_texCoord'到'a_texCoord0'做了窍门。我不知道为什么,但我使用的教程是这样的,但现在它的工作非常感谢 – name 2014-09-28 02:11:41