OpenGL Shadowmaps限制

我想渲染一个OpenGL场景,其中任意数量的点光源(至less1024个)都启用了阴影。

然而,我目前的渲染shadowmaps的方法不能做到这一点。

让我解释

一次只能传递32个纹理。

目前我正在使用这32个纹理中的31个纹理。

伪代码为我的主要代码…

setShader("DepthBufferPointLight", -1); //the int is actually numlights, used for deciding whether or not to recompile a finalpass shader. Irrelevant in this stage and set to -1 for debugging purposes. FBO fBO* = CreateFBOs[6 * numLights] for (int j = 0; j < 6; j++) for (int i = 0; i < 6; i++) { setRenderTarget(fBO[i]); setupCameraforLight(j,i); //Move the camera to the right position renderSceneDepth(); //Textures aren't even rendered for this } setRenderTargetDefault(); setShader("FinalPass", numLights); //The shader dynamically recompiles for final pass calls if the number of lights has changed, because it will need to change how many uniform struct lights there are. setLightTextureUnits(fBO, 6, numLights); //glActiveTexture calls and glBindTexture calls renderSceneFinalPass(); //Textures and uniforms are all set up for this, also does the lights 

然后在着色器管道中,我使用shadowmaps进行计算。 我的伪代码很粗糙,但你得到的照片。

(注意:dynamic重新编译实际上是非常简单的,只改变了着色器的一行,而我将会在我弄清楚统一variables数组是如何工作的时候弃用和删除函数…)

我的代码在numlights * 6大于31后中断。

有一个更好的方法吗?

我的最终目标是使用阴影映射渲染任意数量的点光源

当你进行光通或主渲染通道时,你是否达到这个限制?

有了这么多的光源,我认为你的shadowmap分辨率很低?

我会首先尝试的是把所有的shadowmaps放在一个共享的大纹理中,就像一个地图集。

例如,在8192×8192纹理中,您可以平铺每个64×64 texels的16384个shadowmaps。

在您的主着色器中,您只需计算每个shadowmaps的纹理元素偏移量。

也就是说,1024个光源看起来非常高。 因为你需要为它们中的每一个渲染shadowmaps(来自光源的视图)。 这意味着你的场景至less有1024次渲染过程。 或者在你的情况下,因为你的光源似乎是全方位的,因为你每光照6个视图?

也许我对shadowmaps做了不同的假设。 我做阴影贴图的方法是渲染场景两次。

首先,我从光源的角度渲染场景,将深度存储在深度纹理中。

其次,我使用之前生成的阴影贴图,从相机的角度渲染场景。

有了1024个灯,我希望你的第一个传球需要做太多次?