我与全向点光源工作。 我已经在使用一个立方体贴图作为6帧缓冲区颜色attachement,以及编码在其每一像素的光 - 片段距离实现阴影映射。
现在我想,如果可能的话,要改变我的实现是这样的:
- 1)附加一个深度立方体贴图到我的帧缓冲区的深度缓冲器,而不是颜色。
- 2)只渲染深度,在此通过不写颜色
- 3)在主通,读从立方体贴图的深度,将其转换为距离,并且检查当前片段是否被光或不封闭。
从立方体贴图转换回深度值到一定距离时,我的问题就来了。 我用的是光到片段矢量(在世界空间)的立方体贴图来迎接我的深度值。 在这一点上,我不知道是哪六个面的被使用,也没有什么2D纹理坐标匹配的深度值我读。 然后,我怎么可以在深度值转换为距离?
这里是我的代码来说明片段:
深度纹理:
glGenTextures(1, &TextureHandle);
glBindTexture(GL_TEXTURE_CUBE_MAP, TextureHandle);
for (int i = 0; i < 6; ++i)
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_DEPTH_COMPONENT,
Width, Height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 0);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
帧缓冲区建设:
for (int i = 0; i < 6; ++i)
{
glGenFramebuffers(1, &FBO->FrameBufferID);
glBindFramebuffer(GL_FRAMEBUFFER, FBO->FrameBufferID);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, TextureHandle, 0);
glDrawBuffer(GL_NONE);
}
这件作品的片段着色器,我试图写来实现我的代码:
float ComputeShadowFactor(samplerCubeShadow ShadowCubeMap, vec3 VertToLightWS)
{
float ShadowVec = texture(ShadowCubeMap, vec4(VertToLightWS, 1.0));
ShadowVec = DepthValueToDistance(ShadowVec);
if (ShadowVec * ShadowVec > dot(VertToLightWS, VertToLightWS))
return 1.0;
return 0.0;
}
该DepthValueToDistance功能是我的实际问题。