2014-09-28 2 views
0

В libgdx у меня есть шейдер, и я хочу, чтобы мой объект Stage использовал этот шейдер для рисования. Я попытался настроить шейдер SpriteBatch на свой шейдер, а затем пакет спрайтов Stage, который он представляет, но он отображается как черный экран. Почему это не работает: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, поэтому шейдер будет обрабатывать все УФ-фильтры, как если бы они были 0,0.

Вы упомянули настройку шейдера как на SpriteBatch, так и на SpriteBatch Stage, но в вашем коде они являются одними и теми же.

Вам не нужно звонить begin и end на шейдер, потому что SpriteBatch (и, следовательно, Stage) делает это автоматически. Я не уверен, что это может вызвать проблемы.

Я не могу объяснить, почему то, что вы сделали, сработало бы с одним из ваших текстур. Я бы ожидал, что он просто нарисует все как тот же цвет, что и нижний левый пиксель текстуры.

Возможно, возникли другие проблемы, но я предполагаю, что он правильно рисовал, прежде чем вы вставили свой собственный шейдер.

+0

прежде всего мой код такой же, как и то, о чем я упомянул, но я только что сформулировал его неправильно. начало и конец не имели никакого значения, когда я их удалял, но я попробую изменить его на a_texCoord0 – name

+0

Да, меняет 'a_texCoord' на' a_texCoord0' трюк. Я не знаю, почему, но учебник, который я использовал, поставил его так, но теперь его работа так благодарит – name

Смежные вопросы