我已经在我的游戏的 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 阴影贴图?