我正在使用全向点灯。我已经使用立方体贴图纹理作为 6 个帧缓冲区的颜色附件实现了阴影映射,并在每个像素中编码了光到片段的距离。
现在,如果可能的话,我想以这种方式更改我的实现:
- 1)将深度立方体贴图纹理附加到我的帧缓冲区的深度缓冲区,而不是颜色。
- 2) 仅渲染深度,不要在此通道中写入颜色
- 3)在main pass中,从cubemap纹理中读取深度,将其转换为距离,并检查当前片段是否被光遮挡。
将立方体贴图中的深度值转换回距离时出现了我的问题。我使用光到片段向量(在世界空间中)在立方体贴图中获取我的深度值。此时,我不知道使用了六个面中的哪一个,也不知道哪些 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 函数是我的实际问题。