2016-01-29 5 views
1

Это в основном общий вопрос, так как я не могу заставить какой-либо шейдер работать вообще. Обычные спрайты и текстуры выглядят просто отлично, с шейдерами ничего не происходит. Не получать сообщения об ошибках из журнала шейдеров. Насколько я понимаю, для фильтра типа ниже нужно только установить шейдер в пакет, например batch.setShader (шейдер), и установить любую униформу, и партия позаботится обо всем остальном. Если я ошибаюсь, скажите мне мои ошибки.Шейдеры в libgdx не действуют [Рабочий стол]

Фрагмент шейдеры, должен стираться

//"in" attributes from our vertex shader 
varying vec2 v_texCoord0; 

//declare uniforms 
uniform sampler2D uImage0; 
uniform vec2 uResolution; 

uniform float radius; 
uniform float dirx; 
uniform float diry; 

void main() 
{ 
//this will be our RGBA sum 
vec4 sum = vec4(0.0); 

//our original texcoord for this fragment 
vec2 tc = v_texCoord0; 

//the amount to blur, i.e. how far off center to sample from 
//1.0 -> blur by one pixel 
//2.0 -> blur by two pixels, etc. 
float blur = radius/uResolution.x; 

//the direction of our blur 
//(1.0, 0.0) -> x-axis blur 
//(0.0, 1.0) -> y-axis blur 
float hstep = dirx; 
float vstep = diry; 

//apply blurring, using a 9-tap filter with predefined gaussian weights 

sum += texture2D(uImage0, vec2(tc.x - 4.0*blur*hstep, tc.y - 4.0*blur*vstep)) * 0.0162162162; 
sum += texture2D(uImage0, vec2(tc.x - 3.0*blur*hstep, tc.y - 3.0*blur*vstep)) * 0.0540540541; 
sum += texture2D(uImage0, vec2(tc.x - 2.0*blur*hstep, tc.y - 2.0*blur*vstep)) * 0.1216216216; 
sum += texture2D(uImage0, vec2(tc.x - 1.0*blur*hstep, tc.y - 1.0*blur*vstep)) * 0.1945945946; 

sum += texture2D(uImage0, vec2(tc.x, tc.y)) * 0.2270270270; 

sum += texture2D(uImage0, vec2(tc.x + 1.0*blur*hstep, tc.y + 1.0*blur*vstep)) * 0.1945945946; 
sum += texture2D(uImage0, vec2(tc.x + 2.0*blur*hstep, tc.y + 2.0*blur*vstep)) * 0.1216216216; 
sum += texture2D(uImage0, vec2(tc.x + 3.0*blur*hstep, tc.y + 3.0*blur*vstep)) * 0.0540540541; 
sum += texture2D(uImage0, vec2(tc.x + 4.0*blur*hstep, tc.y + 4.0*blur*vstep)) * 0.0162162162; 

//discard alpha for our simple demo, multiply by vertex color and return 
gl_FragColor = vec4(sum.rgb, 1.0); 
} 

Vertex Shader

attribute vec4 a_color;  
attribute vec2 a_texCoord0; 
attribute vec3 a_position;  

uniform mat4 u_projTrans; 

varying vec4 v_color;  
varying vec2 v_texCoord0; 

void main(){ 
v_color = a_color;   
v_texCoord0 = a_texCoord0;   
gl_Position = u_projTrans * vec4(a_position,1.0) ;   
} 

Настройка затенения. Протестированы различные значения здесь

public void setupShader(){ 
    ShaderProgram.pedantic=true; 
    shader = new ShaderProgram(Gdx.files.internal("shaders/pass.vert"),Gdx.files.internal("shaders/scanlines.frag")); 
    shader.begin(); 
    shader.setUniformf("radius", 5f); 
    shader.setUniformf("dirx", 5f); 
    shader.setUniformf("diry", 5f); 
    shader.end(); 

    if(shader.isCompiled()) 
     batch.setShader(shader); 
    else 
     Settings.log(shader.getLog()); 
} 

Метод визуализации. Я ничего не вкладываю в шейдеры.

@Override 
    public void render(float delta) { 
    Settings.clearScreen();  //usual clear screen calls from here 
    batch.setProjectionMatrix(cam.combined); 
    cam.update(); 

    detectClicks();    
    checkBallScreenEdges(); 

    batch.begin(); 
     draw(delta); 
    batch.end(); 



} 
+1

Вы никогда не укажете свои шейдеры 'uImage0' и' uResolution'. – Tenfour04

+1

Также похоже, что это шейдер пост-обработки, поэтому вы должны визуализировать свою сцену в FrameBuffer как обычно, затем нарисуйте текстуру FrameBuffer на экране с помощью этого шейдера. – Tenfour04

+0

Спасибо, собираюсь попробовать фреймбуфер. Я думал, вам не нужно запускать sampler2D, он просто возвращает текущий пиксель при его создании? –

ответ

1

Благодаря Tenfour04 я получил хороший Scanlines шейдер работать (протестировано с другим, чем один из приведенных выше):

@Override 
public void render(float delta) { 
    Settings.clearScreen(); 
    batch.setProjectionMatrix(cam.combined); 
    cam.update(); 

    batch.setShader(SpriteBatch.createDefaultShader()); 
    main.buffer.begin(); 
    batch.begin(); 
     draw(delta); 
    batch.end(); 
    main.buffer.end(); 

    //POST PROCESSING 
    Texture bufferedTexture = main.buffer.getColorBufferTexture(); 
    batch.setShader(main.shader); 
    batch.begin(); 
    batch.draw(bufferedTexture, 0, 0, Settings.WIDTH, Settings.HEIGHT, 0, 0, Settings.WIDTH, Settings.HEIGHT, false, true); //need to flip texture 
    batch.end(); 
} 

и настройке шейдера:

buffer = new FrameBuffer(Pixmap.Format.RGBA8888,Settings.WIDTH,Settings.HEIGHT,false); 

    ShaderProgram.pedantic=false; 
    shader = new ShaderProgram(Gdx.files.internal("shaders/pass.vert"),Gdx.files.internal("shaders/scanlines.frag")); 
    shader.begin(); 
    shader.setUniformf("uResolution",(float)Settings.WIDTH,(float)Settings.HEIGHT); 
    shader.end(); 

пожелав В libgdx wiki было больше примеров.

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