我阅读并实现了以下教程:https : //learnopengl.com/Advanced-Lighting/Shadows/Point-Shadows
现在,我想对其进行概括以在场景中渲染多个点光源,我将如何处理?我听说立方体贴图数组可以用于类似这样的事情,它们如何工作?有人可以给我举个例子吗?
(我正在为自己和子孙后代回答这个问题,因为目前还没有关于Google如何使用多维数据集数组的易于使用的Google教程。)
如果要将多个立方体贴图阴影贴图传递到着色器,并且事先不知道确切多少个立方体贴图数组是一个好的解决方案。它们就像3D纹理一样工作,其中每个图层都是一个立方体贴图。在片段着色器中,您可以为它们创建一个采样器,如下所示:
uniform samplerCubeArray cubeMapArray;
您可以通过以下方式将数组纹理绑定到它:
glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, m_PointLightDepthMaps.m_DepthTexture);
您可以像从多维数据集贴图一样从samplerCubeArray进行采样,但是在这种情况下,矢量会获得第四个元素,即要从中采样的图层。例如:
texture(cubeMapArray, vec4(dir, 3)).r
将从数组中的第四个立方体贴图采样。要创建一个可以用作深度纹理的立方体贴图数组,可以使用以下模板:
void Renderer::initCubemapDepthMap(CubemapDepthMap& map)
{
glGenTextures(1, &map.m_DepthTexture);
glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, map.m_DepthTexture);
glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
glTexImage3D(
GL_TEXTURE_CUBE_MAP_ARRAY, 0, GL_DEPTH_COMPONENT, m_ShadowCubeMapResolution, m_ShadowCubeMapResolution, 6 * m_MaxPointLights + 6 * m_MaxSpotLights, 0,
GL_DEPTH_COMPONENT, GL_FLOAT, nullptr);
glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, 0);
glGenFramebuffers(1, &map.m_FrameBuffer);
glBindFramebuffer(GL_FRAMEBUFFER, map.m_FrameBuffer);
glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, map.m_DepthTexture, 0);
glDrawBuffer(GL_NONE);
glReadBuffer(GL_NONE);
const int status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if (status != GL_FRAMEBUFFER_COMPLETE)
{
std::cout << "ERROR::FRAMEBUFFER:: Framebuffer is not complete!\n";
throw 0;
}
glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
请注意,您需要使用GL_TEXTURE_CUBE_MAP_ARRAY作为纹理类型,并且需要使用glTexImage3D。调用glTexImage3D时,层数是所需的立方体贴图的数量乘以6,因为每个立方体贴图的面都像单独的图层一样分配。在片段着色器中采样时,无需考虑这一点!
渲染阴影贴图时,您像绑定其他缓冲区一样绑定缓冲区。当您将深度纹理传递给着色器时,您将传递整个立方体贴图数组,而无需弄乱单独的图层。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句