我现在已经在我的游戏的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阴影贴图,就好像遮挡贴图上没有任何内容一样。我试过翻转遮挡贴图,我查看了着色器的错误日志,理论上它很好。
我做错了什么?有没有另一种方法来生成一维阴影贴图?
答案 0 :(得分:0)
这里的问题是制服没有设置,因为我忘了打电话开始和结束前后。
shadowMapShader.begin();
shadowMapShader.setUniformf("ts", Alpha.getWidth(),Alpha.getHeight());
shadowMapShader.end();