使用阴影贴图时,帧缓冲区没有深度缓冲区

时间:2018-02-12 20:24:29

标签: opengl-es shadow

我有阴影贴图在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"});
}

想法?感谢

这是一张快照。 enter image description here

0 个答案:

没有答案
相关问题