0

我已经在我的游戏的 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 阴影贴图,就好像 Occlusion 贴图上什么都没有。我试过翻转遮挡贴图,查看了着色器的错误日志,理论上没问题。

我做错了什么?是否有另一种方法可以生成 1D 阴影贴图?

4

1 回答 1

0

这里的问题是制服没有设置,因为我忘记在之前和之后调用开始和结束。

shadowMapShader.begin();
shadowMapShader.setUniformf("ts", Alpha.getWidth(),Alpha.getHeight());
shadowMapShader.end();
于 2015-04-27T11:51:08.753 回答