2014-09-28 71 views
0

在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並沒有什麼區別。

回答

0

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