我正在处理全向点光源。我已经使用 cubemap 纹理作为 6 个帧缓冲的颜色附加物,实现了阴影映射,并将从光到片段距离编码在其每个像素中。
现在,如果可能的话,我想改变我的实现方式:
1. 将深度立方体纹理附加到我的帧缓冲区的深度缓冲区,而不是颜色。
2. 只渲染深度,在此过程中不写入颜色。
3. 在主过程中,从 cubemap 纹理中读取深度,将其转换为距离,并检查当前片段是否被光遮挡或未被遮挡。
当将一个深度值从 cubemap 转换回距离时,我的问题出现了。我使用光线到片段向量(在世界空间中)来获取我的 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;
}
深度值转距离函数是我的实际问题。
*shadow
采样器等)-只是我没有工作代码片段,并且不想写一个。 - SigTerm