如何从遮挡贴图制作一维阴影贴图?我变白了

时间:2015-04-25 20:30:47

标签: java opengl glsl fbo post-processing

我现在已经在我的游戏的GPU后期处理效果中工作了一段时间,但我遇到了一个似乎无法解决的问题,试图实现自上而下的定向灯。

我已经从场景中生成了一个遮挡贴图,我正在尝试使用这个着色器创建一个高度贴图,其灵感来自libgdx的像素完美阴影教程:

varying vec2 vTexCoord0;

uniform sampler2D u_texture;
uniform vec2 ts; // the occlusion texture size

void main(void) {
    float dst = 1.0;
    for (float y=0.0; y<ts.y; y+=1.0) {
        float d = y/ts.y;
        vec2 coord = vec2(vTexCoord0.x, dst);
        vec4 data = texture2D(u_texture, coord);

        if (data.r > 0.0) {
            dst = min(dst, d);
        }
    }
    gl_FragColor = vec4(dst);
}

输入纹理就像是一个最小为0且纹理最大为100%的正弦波。 (我还不能张贴图片,我需要更多声望)但是正弦波上的纹理是不透明的(如果在FBO渲染后没有翻转),而且在有空气的地方透明。

java渲染代码就是这个:

public void MakeShadowMap() {

        cam2.setToOrtho(false, shadowMapFBO.getWidth(), shadowMapFBO.getHeight());
        //cam2.position.set(Vector3.Zero);
        cam2.update();

        shadowMapShader.setUniformf("ts", Alpha.getWidth(),Alpha.getHeight());

        shadowMapFBO.begin();

        Gdx.gl20.glClearColor(0f, 0f, 0f, 0f);
        Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT);
        Gdx.gl20.glEnable(GL20.GL_BLEND);
        Gdx.gl20.glBlendFuncSeparate(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA, GL20.GL_ONE, GL20.GL_ONE);

        batch.setProjectionMatrix(cam2.combined);
        batch.setShader(shadowMapShader);
        batch.begin();

        batch.draw(Alpha.getColorBufferTexture(),0,0, shadowMapFBO.getWidth(), shadowMapFBO.getHeight()); // Alpha is the Occlusion FBO

        batch.end();

        shadowMapFBO.end();
        Gdx.gl20.glDisable(GL20.GL_BLEND);
        Gdx.gl20.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);

    }

但是使用此着色器,它会生成完全为白色的1D阴影贴图,就好像遮挡贴图上没有任何内容一样。我试过翻转遮挡贴图,我查看了着色器的错误日志,理论上它很好。

我做错了什么?有没有另一种方法来生成一维阴影贴图?

1 个答案:

答案 0 :(得分:0)

这里的问题是制服没有设置,因为我忘了打电话开始和结束前后。

shadowMapShader.begin();
shadowMapShader.setUniformf("ts", Alpha.getWidth(),Alpha.getHeight());
shadowMapShader.end();