Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java libgdx中的着色器没有效果[桌面]_Java_Libgdx_Glsl_Shader - Fatal编程技术网

Java libgdx中的着色器没有效果[桌面]

Java libgdx中的着色器没有效果[桌面],java,libgdx,glsl,shader,Java,Libgdx,Glsl,Shader,这主要是一个一般性问题,因为我根本无法让任何着色器工作。通常的精灵和纹理渲染很好,只是着色器不会发生任何事情。也没有从着色器日志中获取任何错误消息。据我所知,对于以下类型的过滤器,只需将着色器设置为批处理,如batch.setShader(着色器),并设置任何一致性,批处理将处理其余内容。如果我错了,请告诉我我的错误 片段着色器,应该是模糊的 //"in" attributes from our vertex shader varying vec2 v_texCoord0; //declare

这主要是一个一般性问题,因为我根本无法让任何着色器工作。通常的精灵和纹理渲染很好,只是着色器不会发生任何事情。也没有从着色器日志中获取任何错误消息。据我所知,对于以下类型的过滤器,只需将着色器设置为批处理,如batch.setShader(着色器),并设置任何一致性,批处理将处理其余内容。如果我错了,请告诉我我的错误

片段着色器,应该是模糊的

//"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);
}
顶点着色器

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



}

多亏了Tenfour04,我得到了一个不错的扫描线着色器(使用上述着色器以外的另一个进行了测试):

以及设置着色器:

    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有更多的例子。

你从来没有为着色器指定你的
uImage0
uResolution
制服。而且它看起来像是一个后处理着色器,所以你需要正常地将场景渲染到帧缓冲区,然后使用该着色器将帧缓冲区的纹理绘制到屏幕上。谢谢,我要试试帧缓冲区。我以为你不需要初始化sampler2D,它只是在创建时返回当前像素?sampler2D是指向纹理的指针。我想如果你让它保持初始化状态,它将指向纹理单元0,所以如果你也像SpriteBatch为你做的那样将纹理绑定到单元0,它可能是好的。但这并不能保证所有GPU都能正常工作。
    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();