我有阴影贴图在Android上工作得很好但是有一个问题 - 阴影'泄漏'因此,想象一下嵌入地形地板的圆柱体,其中一些部分位于该地形下。上面的部分创造了一个与光源相对的漂亮阴影,但地形下的药水向前投射了阴影 - 朝向光线。它好像没有深度缓冲区。 这是我的frambuffer代码(我认为问题出在哪里)。
MyGLRenderer.shadowsize=4096;
GLES20.glGenTextures(1, temp2qshadow, 0);
LoadIntroPics.fboTexqshadow = temp2qshadow[0];
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, fboTexqshadow);
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, MyGLRenderer.shadowsize, MyGLRenderer.shadowsize/2, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, null);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);
GLES20.glGenFramebuffers(1, tempqshadow, 0);
MyGLRenderer.fboIdshadow = tempqshadow[0];
GLES20.glGenRenderbuffers(1, temp3qshadow, 0);
LoadIntroPics.renderBufferIdqshadow = temp3qshadow[0];
GLES20.glBindRenderbuffer(GLES20.GL_RENDERBUFFER, renderBufferIdqshadow);
GLES20.glRenderbufferStorage(GLES20.GL_RENDERBUFFER, GLES20.GL_DEPTH_COMPONENT16, MyGLRenderer.shadowsize, MyGLRenderer.shadowsize/2);
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, MyGLRenderer.fboIdshadow);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, LoadIntroPics.fboTexqshadow);
GLES20.glFramebufferRenderbuffer(GLES20.GL_FRAMEBUFFER, GLES20.GL_DEPTH_ATTACHMENT, GLES20.GL_RENDERBUFFER,LoadIntroPics.renderBufferIdqshadow);
GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_TEXTURE_2D, LoadIntroPics.fboTexqshadow, 0);
这是影子地图代码......
protected String getVertexShaderShadow()//this needs a model view projection matrix
{
final String vertexShader =
"precision highp float; \n"
+"attribute vec4 a_Position; \n"
+"uniform mat4 u_MVPMatrix; \n"
//+"uniform mat4 u_ShadowMatrix; \n"
+"attribute vec2 a_TexCoordinate; \n"
+"varying vec2 v_TexCoordinate; \n"
+"varying vec4 v_v4TexCoord; \n"
+"void main() \n"
+"{ \n"
+"v_TexCoordinate = a_TexCoordinate; \n"
+"gl_Position =u_MVPMatrix * a_Position; \n"
+"v_v4TexCoord = u_MVPMatrix * a_Position; \n"
+"} \n";
return vertexShader;
}
protected void getFragmentShaderShadow()
{
final String fragmentShader =
"precision highp float; \n"
+"uniform sampler2D u_Texture; \n"
+"uniform int decal; \n"
+"varying vec2 v_TexCoordinate; \n"
+"varying vec4 v_v4TexCoord; \n"
+"void main() \n"
+"{ \n"
+"vec4 col=texture2D(u_Texture, v_TexCoordinate); \n"
+"if(decal==1){if(col.r<=0.25 && col.g<=0.25 && col.b<=0.25)discard;} \n"
+"if(decal==2){if(col.r<=0.05 && col.g<=0.05 && col.b<=0.05)discard;} \n"
/* Generate shadow map - write fragment depth. */
+"float value = 10.0 - v_v4TexCoord.z; \n"
+"float v = floor(value); \n"
+"float f = value - v; \n"
+"float vn = v * 0.1; \n"
+"gl_FragColor = vec4(vn, f, 0.0, 1.0); \n"
//+"gl_FragColor=vec4(1.0,1.0,1.0,1.0); \n"
+"} \n";
fragmentShaderHandle =compileShader(GLES20.GL_FRAGMENT_SHADER, fragmentShader);
MyGLRenderer.mPerVertexProgramHandleShadow = createAndLinkProgram(MyGLRenderer.vertexShaderHandleShadow, fragmentShaderHandle,
new String[] {"a_Position", "a_Color", "a_Normal", "a_TexCoordinate"});
}
想法?感谢