问题标签 [shadow-mapping]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
opengl - sampler2DShadow 偏差组件在 GLSL 中不起作用?
我正在尝试在 opengl core 3.3 中实现阴影贴图。当我向 GLSL 中的纹理函数发送偏差时,它似乎根本没有做任何事情。我用错了吗?
我正在使用 linux、nvidia 专有驱动程序和 golang。怀疑它与它有什么关系,但以防万一,它就在那里。
opengl - 立方体贴图中的 PCF (PCSS)
我正在关注这篇论文,以便在我的引擎中实现 PCSS。
不过我有一个小问题。到目前为止,我的引擎只允许全向灯——我稍后会添加更多,但这不是问题。所以,首先,我实现了硬阴影映射。这是一场胜利。
我决定通过 PCSS 将我的硬阴影变成软阴影。作为一个细心的人,我决定在 PCF 做第一枪,让我的脚湿透。这是失败的。
在2D 纹理上,它非常简单。我只是使用一个简单的内核从光深度图中采样几个值,然后用一个盒子/泊松/高斯/任何过滤器对它们进行平均。
但是我应该如何在立方体贴图中做到这一点?!偏移量是方向,我真的不知道该怎么做……</p>
c++ - 阴影立方体贴图的分层渲染
我正在尝试使用分层渲染一次渲染阴影立方体贴图。
我试图尽可能彻底:
- 我使用 glFramebufferTexture 绑定了深度附件(GL_DEPTH_ATTACHMENT_32F)和颜色附件 0(GL_R32F)的立方体贴图
- 我确保检查,一旦纹理附加到 FBO,帧缓冲区的完整性 - 它是完整的
- 我已经使用“layout(triangles, invocations=6) in;”尝试了几何着色器实例化。并且没有(求助于 for(int layer=0;layer<6;++layer) 循环,设置 gl_Layer = l,首先为每个图元,然后为每个顶点)
长话短说,第一层(即本例中的 X+)被渲染,但其他层都没有,无论是深度还是颜色附件。
似乎关于分层渲染的文档非常稀少,即使是红皮书也最多花费半页......无论如何:
编码 :
着色器:
顶点:
/li>几何学 :
/li>片段:
/li>
C ++(主要使用我的引擎的类,实际上只做了最低限度的工作,并且已经测试过,对于 FBO,使用 2D(点)阴影贴图):
opengl - 定向光视图/投影矩阵
我在为定向光实现阴影映射时遇到了困难。我不知道如何正确设置矩阵......我希望阴影从左上角出现(如太阳投射)。我所拥有的只是以下代码来生成世界空间中的平截头体角:
如何设置太阳的视图矩阵?
opengl - 现代无伪影阴影映射
我正在尝试找到用于我的游戏引擎的最佳阴影映射技术。到目前为止,我已经使用 PCF、级联阴影贴图和方差阴影贴图实现了标准阴影贴图。然而,它们似乎都没有提供令人满意的结果。
我正在尝试为所有情况找到最佳阴影映射方法。我需要背面正确的几何形状,因此可以使用渲染背面。然而,我也有相当多的低多边形平滑法线几何,即使在绘制背面时也会导致一些非常难看的粉刺。
还有哪些其他技术可以用来获得漂亮的阴影贴图,没有严重的粉刺、彼得平移或轻微出血,而且不对几何体施加任何主要限制(仅背面)?
opengl - 级联阴影贴图不太正确
好的。所以,上周我一直在玩弄我的游戏引擎中的阴影。我主要实现了级联阴影贴图 (CSM),但我在阴影方面遇到了一些问题,我似乎无法解决。
此场景中唯一的光是定向光(太阳),指向 {-0.1 -0.25 -0.65}。我使用以下代码为我的 CSM 的四个拆分计算 4 组截锥边界:
对于灯光,我得到一个像这样的视图矩阵:
然后我从每个平截头体的边界创建每个正交矩阵:
我有一个 4 层 TEXTURE_2D_ARRAY 绑定到 4 个帧缓冲区,我使用非常简单的顶点着色器(禁用片段或穿透 alpha)将场景绘制到其中。
然后我画出最后的场景。顶点着色器输出四个阴影纹理坐标:
还有一个片段着色器,它确定要使用的拆分:
并使用此函数对阴影贴图数组进行采样:
而且,这是我得到的场景(每个分割点都略微着色,并且 4 个深度层重叠): 太棒了!看起来不错。
但是,如果我将相机稍微向右转动: 然后阴影开始消失(并且取决于角度,出现在它们不应该出现的位置)。
我启用了 GL_DEPTH_CLAMP,所以这不是问题。我正在剔除正面,但将其关闭对这个问题没有影响。
我错过了什么?我觉得这是我的一个预测的问题,但它们在我看来都是正确的。谢谢!
编辑:所有四个光的平截头体都被绘制了。它们都在那里,但只有 z 相对于相机在变化(见下面的评论):
编辑:可能更有用,这就是当我只更新一次截锥体时,当相机位于 (0,0,0) 并指向前方 (0,1,0) 时截锥体的外观。这次我也用深度测试画了它们。
重要编辑:似乎这个问题与灯光的视图矩阵直接相关,目前:
更改 eye 和 target 的值似乎会影响错误的阴影。但我不知道我实际上应该将它设置为什么?对于比我更好理解的人来说应该很容易:D
opengl - 具有延迟渲染、位置变换的 OpenGL 阴影映射
我正在使用延迟渲染,我将眼睛空间位置相应地存储在纹理中:
顶点:
几何学:
分段:
现在,在第二个通道(照明通道)中,我尝试使用从这个 vec4 计算的 UV 坐标对我的阴影贴图进行采样
使用的位置与从位置纹理存储和采样的位置相同。在进行此计算之前,我是否需要使用逆相机视图矩阵转换位置?将其带回世界空间或我应该如何进行?
opengl - 如何为阴影映射和百分比更紧密过滤选择世界空间中的光大小?
嗨计算机图形和数学人:-)
简短的问题:如何让艺术家在世界空间中为通过百分比更接近过滤 (PCF) 过滤的阴影贴图选择有意义的灯光大小,是否可以使用相同的技术来支持点光源和定向光源?
更长的问题:我已经实现了阴影映射并通过应用百分比更接近过滤(PCF)过滤边缘。与常规的矩形滤波器内核相比,滤波器内核是泊松盘。您可以将泊松盘视为或多或少随机分布在单位圆内的样本位置。因此,过滤器区域的大小只是乘以内核(泊松盘)的每个 2D 样本位置的因子。
我可以调整泊松圆盘的半径/因子,并在运行时为聚光灯(透视平截头体)或定向光(正交平截头体)更改半影的大小。这很好用,但参数的值并没有任何意义,这对于小型 3d 样本甚至可以投入一些时间来根据经验调整值的游戏来说都很好。我想要的是一个名为“LightSize”的参数,它在世界空间中具有实际意义。例如,一个大型场景,一个 100 单位长的建筑物,LightSize 必须比书架特写的场景更大,才能产生相同的平滑阴影。另一方面,固定的 LightSize 会导致架子上的阴影非常平滑,而建筑物外的阴影则非常硬。这个问题不是关于柔和的阴影,
哦,看看我很棒的 MS Paint 插图:
想法1:如果我直接使用 LightSize 作为过滤器大小,0.5 的系数将导致对角线为 1.0 和半径为 0.5 的泊松盘。由于纹理坐标在 [0,1] 范围内,这导致过滤器大小评估每个片段的整个纹理:想象一个片段位于阴影贴图的中心,该片段将获取分布在整体内部的相邻纹素纹理区域。这当然会产生非常大的半影,但我们称之为“最大值”。例如,0.05 的半影因子将导致对角线为 0.1,因此每个片段将评估大约 10% 的相邻纹素(忽略圆圈等。从侧面看 2d 视图)。这种方法有效,但是当聚光灯的角度变大或定向光的平截头体改变其大小时,由于 LightSize 在纹理空间(UV 空间)中定义了半影,所以半影改变了它的宽度。半影应该保持不变,与近平面的大小无关。想象一个合适的正交平截头体。当相机旋转时,安装的平截头体的大小会发生变化,半影的大小也会发生变化,这是错误的。
想法2:将LightSize除以世界空间中近平面的大小。这对于正交投影非常有效,因为当截头体的尺寸变大时,LightSize 会除以更大的值,这样半影在世界空间中保持不变。不幸的是,这不适用于透视平截头体,因为近平面的距离会导致近平面的大小发生变化,因此半影大小现在取决于近平面距离,这是令人讨厌和错误的。
感觉必须有一种方法让艺术家可以在世界空间中选择有意义的灯光尺寸。我知道 PCF 只是物理上合理的光源的(相当糟糕的)近似值,但想象一下:当在世界空间中使用泊松盘对光源进行多次采样时,可以通过渲染来创建物理上准确的阴影每个样本位置的硬阴影。这适用于聚光灯。定向灯的情况有所不同。可以使用“定向光原点的角度”并为每个略微旋转的平截头体渲染多个硬阴影。这在现实世界中根本没有任何物理意义,但不存在定向光,所以……顺便说一下,光源的采样通常被称为多视图软阴影(MVSS)。
你有什么建议吗?是不是必须以不同的方式处理聚光灯和定向光,而 PCF 不允许我使用有意义的真实世界光大小来制作透视平截头体?
c++ - 稳定的阴影贴图
我正在尝试稳定 3D 渲染器中的阴影。我正在使用 CSM。
这是我得到的代码,没有试图稳定。世界空间中的投影大小至少应该保持不变:
这样可行。但是,阴影闪烁并疯狂地游动。所以,这是一个稳定的尝试,通过尝试将它们捕捉到纹理大小的增量,正如到处推荐的那样,但似乎从未解释过:
这会有所不同,因为阴影现在游得很慢,而不是弹跳得太快而无法注意到任何图案。但是,我很确定这只是偶然,而且我根本没有抓住正确的东西,甚至没有抓住正确的东西。
opengl - 如何在立方体贴图阴影中使用偏置
所以,我还有一个关于阴影贴图的问题。我正在尝试使用立方体贴图阴影实现点光源,并且几乎可以正常工作。
我将阴影渲染成 DEPTH_COMPONENT16 类型的立方体贴图。我进行了 6 次通过,使用与定向光和聚光灯完全相同的着色器。我没有任何颜色输出,只使用深度缓冲区。我认为这应该没问题,因为立方体贴图几乎只有 6 个聚光灯,我没有任何问题。
现在,当我尝试在我的光照着色器中采样阴影贴图时,我的问题就来了。我的渲染器被延迟了,所以我必须从深度重建所有位置。
当我从立方体贴图中采样时,我这样做:
get_bias 函数:
sample_shadow 函数:
而且,这就是我得到的。我禁用了距离滚降,以便更容易看到问题:
因此,偏置不能正常工作。调整 get_bias 函数以返回更大的值似乎没有帮助。消除粉刺的唯一方法似乎是增加一个巨大的恒定偏差,这显然不是一个选择。
为了比较,这里是一个聚光灯,在同一个地方以 90 度的视野渲染。着色器使用相同的 get_bias 函数,近/远平面相同(0.2/5.0):
没有偏见问题。我可以只使用 6 个聚光灯(没有圆边),但我宁愿使用立方体贴图。我究竟做错了什么?