Opengl es OpenGL ES3帧缓冲区以红色比例绘制深度

Opengl es OpenGL ES3帧缓冲区以红色比例绘制深度,opengl-es,glsl,framebuffer,opengl-es-3.0,shadow-mapping,Opengl Es,Glsl,Framebuffer,Opengl Es 3.0,Shadow Mapping,因此,经过艰苦的工作,使平行光阴影贴图工作,最终我可以看到一个阴影贴图渲染在一个四边形上,但它只绘制了深度GL_depth_component 16和类型GL_UNSIGNED_SHORT,或GL_depth_component 32f和类型GL_FLOAT,但它是红色的,而不是灰色的 问题是我使用了很多方法来计算阴影的深度,但是没有阴影出现 glCullFace(GL_FRONT); glGenFramebuffers(1, &depthMapFBO);

因此,经过艰苦的工作,使平行光阴影贴图工作,最终我可以看到一个阴影贴图渲染在一个四边形上,但它只绘制了深度
GL_depth_component 16
和类型
GL_UNSIGNED_SHORT
,或
GL_depth_component 32f
和类型
GL_FLOAT
,但它是红色的,而不是灰色的

问题是我使用了很多方法来计算阴影的深度,但是没有阴影出现

glCullFace(GL_FRONT);
            glGenFramebuffers(1, &depthMapFBO);
            glBindFramebuffer(GL_FRAMEBUFFER, depthMapFBO);
            glGenTextures(1, &depthMap);
            glBindTexture(GL_TEXTURE_2D, depthMap);
            glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT16, SHADOW_WIDTH, SHADOW_HEIGHT, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, NULL);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE);

            glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, depthMap, 0);
            glDrawBuffers(1, GL_NONE);
            glReadBuffer(GL_NONE);
            glBindFramebuffer(GL_FRAMEBUFFER, 0);
            glBindTexture(GL_TEXTURE_2D, 0);
            glCullFace(GL_BACK);
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
    LOGI("framebuffer incomplete");
}
片段是:

uniform mediump sampler2DShadow  shadowMap;
......
float bias = 0.005;
float visibility = 1.0;
for (int i=0;i<4;i++){
    int index = i;
    visibility -= 0.2*(1.0-texture( shadowMap, vec3(FragPosLightSpace.xy + poissonDisk[index]/700.0,  (FragPosLightSpace.z-bias)/FragPosLightSpace.w) ));           
}
result =light.intensity* (visibility * (diffuse + specular));
uniformmediump采样器2dshadowmap;
......
浮动偏差=0.005;
浮动能见度=1.0;
对于(int i=0;i
…但它是红色的,不是灰色的

具有深度分量格式的纹理,例如
GL\u depth\u COMPONENT16
GL\u depth\u COMPONENT32F
只有一个颜色通道,即红色颜色通道。
如果从纹理采样器(深度组件纹理绑定到该采样器)读取数据,则会自动设置绿色、蓝色和alpha通道

Khronos集团的规范规定:

图像格式不必存储每个组件。当着色器对此类纹理进行采样时,它仍将解析为4值RGBA向量。图像格式未存储的组件将自动填充。如果缺少R、G或B,则使用零,而缺少的Alpha始终解析为1。

注意:纹理swizzling可以更改缺少的值

因此,将设置红色,将绿色和蓝色设置为0,将alpha通道设置为1。这将导致不透明的红色表面

如果要从深度分量纹理读取灰度颜色,则必须读取红色颜色通道,并且还必须将红色通道应用于绿色和蓝色

您必须像这样调整代码:

float depth          = texture( shadowMap, ..... ).r;
vec3  depthGrayscale = vec3( depth );
或者这个:

vec3  depthGrayscale = texture( shadowMap, ..... ).rrr;

非常感谢,你帮了我很多