问题标签 [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 - PCF 和掠射光又名投影混叠
我目前正在实施和修改一些用于阴影映射的替代偏置解决方案。我当然会将它们与不同的柔和阴影技术结合起来。
我在 PCF 上遇到了一些问题。我通过测试光线方向和片段法线的点积是否大于 0 来对表面的背面进行阴影处理,因此它只能是任何东西的背面。对硬阴影效果非常好。
所以基本上我的片段着色器中的这行代码会遮蔽任何对象的背面:
并且在硬阴影下可以正常工作。当谈到 PCF 时,我的第一个意图是像上面一样使用它,以检查过滤器内核中的当前纹素是否处于阴影中。这是用于阴影测试 PCF 过滤器内核的当前纹素的语句:
但是从物体前面到物体后面的“阴影边缘”仍然是硬“阴影边缘”。这当然是有道理的,因为对于 PCF 过滤器内核的任何纹素,总是会测试当前片段的法线,因此如果片段位于对象的背面,则该片段将完全被遮蔽。但是,当我删除“点积测试”时,在物体从正面到背面的褪色过程中,由于掠光,我遇到了出现伪影的问题。
使用“点积测试”:如您所见,实际投射的阴影看起来不错,但物体背面的阴影是硬阴影:
没有“点积测试”:“背面阴影”的边缘开始向光前软化,但随后仍以硬边缘结束。您还可以看到一些伪像,我猜这些伪像来自该区域的欠采样:
我该怎么做才能在“背面阴影”的边缘获得一个好的(或至少更好的)柔和阴影?如果不引入“查询虚拟阴影贴图”之类的非常复杂的算法,这当然是该情况的完美解决方案,但这是针对交互式应用程序的,因此无法使用这样的过程。
还是我根本没有机会针对交互式应用程序进行这样的混叠。
如果您认为“背面阴影”的硬边是可以接受的,我很感兴趣?
opengl - Normalized depth buffer writes in opengl
Im doing shadowmapping for directional lights, and the standard depth bias matrix doesnt give the same results on diffirent hardware.
After some debugging, I'm pretty sure that some gpu-s write to the depth buffer normalized values [0, 1] and some orthographic projection values [-1, 1].
How do i force all gpus to write values in the same interval? Is there an OpenGL command?
c++ - OpenGL 中使用聚光灯的阴影映射会产生不寻常的效果
我一直在尝试实现阴影映射。虽然我认为我现在已经接近了,但我遇到了一个奇怪的效果(如下图所示):
如您所见,阴影区域显得太小。立方体本身也有不寻常的影响。
正在渲染的几何图形是一个维度为 1.0 的立方体,位于维度为 100.0 的正方形平面上。该场景包含一个角度(从一侧到另一侧)为 0.5 弧度且范围为 100.0 的聚光灯。该聚光灯围绕 y 轴旋转并调整其旋转以查看原点。
我设置帧缓冲区和深度纹理(512 x 512)如下:
然后我从聚光灯的角度将场景渲染到阴影贴图帧缓冲区。这似乎奏效了。使用 OpenGL 调试工具检查深度纹理显示以下内容:
第二次渲染场景,我设置了深度纹理和阴影矩阵的制服:
我在顶点着色器中计算阴影坐标:
然后,在片段着色器中,我投影这个坐标并将其偏置到区间 [0, 1] 中。
c++ - 使用阴影映射将 OpenGL 场景渲染为黑色
我正在尝试使用本教程在我的 OpenGL 引擎中实现阴影映射:http: //www.fabiensanglard.net/shadowmapping/index.php
我在制作阴影贴图时没有任何问题(我认为)。但是使用它,场景完全被遮蔽了。
我渲染场景的方式如下:
设置深度 FBO
从光的角度制作 ModelViewProjection 矩阵并将其存储在 shadowMatrix 变量中。
我使用的功能:
在深度帧缓冲区中渲染场景。着色器:
顶点着色器:
片段着色器:
对于我的 3 个盒子场景,线性化深度如下所示:
http://www.2shared.com/photo/IExy9aUo/Depth.html
所以我认为shadowMatrix和深度渲染是正确的。
最后一步只是用阴影贴图绘制场景
顶点着色器:
片段着色器:
结果 ?我所有的场景都被遮住了!
opengl - 使用立方体贴图(OpenGL/GLSL)的点光是否可以实现软阴影?
我编写了一个管理聚光灯阴影映射的 3D 应用程序。为此,我使用了经典的阴影映射技术(我在第一个渲染通道中填充深度纹理,在第二个渲染通道中,我比较了从灯光到第一个遮挡物的距离以及从灯光到顶点位置的距离,以了解我的片段是否在阴影中)。
这是一个屏幕截图(聚光灯/2D 深度纹理阴影映射):
在本例中,我使用函数“textureProjOffset”使用 PCF 阴影映射技术。这是我的片段着色器中的一段代码:
使用的采样器:
对于硬阴影:
对于 PCF SOFT 阴影:
我还管理了基本的立方体贴图阴影映射来管理当前应用于点光源的全向阴影映射。为了在第一个渲染通道中做到这一点,我使用几何着色器来调度由 6 个阴影截头体提供的投影和视图矩阵(全部在一个通道中!这与这次用 6 个渲染状态填充 6 个单独的纹理的技术不同)。
这是一个截图(聚光灯/立方体深度纹理阴影映射):
如您所见,它只是硬阴影贴图。为了恢复编码到立方体贴图中的深度值,这次我必须使用函数'texture'('samplerCube'和'samplerCubeShadow'不存在textureProj)。接下来我必须计算世界空间中光照位置和顶点位置之间的距离,然后将其转换为剪辑空间,因为纹理中包含的深度值已经在剪辑空间中。
这是片段着色器中的一段代码,可以查看该过程:
使用的采样器:
对于硬阴影:
并且知道,使用立方体贴图的 PCF SOFT 阴影怎么样?我做了一些研究,显然它不存在任何恢复纹理偏移的功能,就像使用简单的 2D 纹理和在片段着色器中使用关键字“sampler2DShadow”一样。我错了吗 ?(但愿如此!)。
我想我有一个解决方案(当然,如果它不存在立方体贴图的任何解决方案):
显然,要恢复纹理偏移,我将不得不使用 6 个单独的纹理(因此,一个大小为 6 的“sampler2DShadow”数组而不是“samplerCubeShadow”)。因此,我将拥有一个同样均匀的矩阵 4x4 数组来表示光空间中的世界表示,就像我在第一个案例中对聚光灯阴影映射所做的那样。然后我将使用“textureProjOffset”方法来处理这 6 个纹理。
所以你怎么看?是否可以使用立方体贴图进行 PCF 软阴影?如果不是这样,我的解决方案是否正确?是否可以使用“samplerCube”或“samplerCubeShadow”来使用“textureProjOffset”之类的函数?还是有替代方案?
非常感谢您的帮助!
opengl - 使用 OpenGL 和 GLSL 的简单硬阴影映射技术的小工件
由于我使用的纹理颜色深沉(这些伪影不可见),我以前从未见过的硬阴影有一种奇怪的行为。这是我使用 3 种不同阴影贴图分辨率的问题的一些屏幕截图:
1) 阴影贴图 160 * 120
如您所见,立方体表面有一种牙齿。
这是从灯光位置看的场景:
这是阴影贴图:
2) 阴影贴图 640 * 480
分辨率越高,伪影就越不明显,因为阴影贴图带来了更高的精度。
这是从灯光位置看的场景:
这是阴影贴图:
我尝试了更高的其他分辨率。当然,伪影越来越小,但如果你放大表面,它们仍然可见。
这是我在第二次传递期间在片段着色器中使用的代码:
所以我想知道是否有可能去除立方体边缘的这些伪影。我试图在没有真正成功的情况下使用阴影偏差(有关信息,我在第一遍(填充深度纹理)期间使用 FRONT_FACE 剔除)。
ios - 打开 GL ES 对象未出现在阴影贴图中?
这让我发疯!我以前对 OpenGL 做的不多,所以任何指针都表示赞赏。
谁能告诉我为什么我的一些对象出现在我的阴影贴图中而其他对象没有出现的任何原因?
我有 2 个正在渲染的对象;南半球和框架。这两者都被渲染到场景和阴影贴图纹理。场景完美地显示了所有对象,但只有南半球出现在阴影贴图中。
我的阴影贴图纹理是这样绑定的:
在我的渲染函数中,我渲染到阴影贴图纹理:
然后我渲染到场景:
我的绘图功能如下所示:
谢谢。
编辑:
我已将问题归结为我的顶点数组 - 特别是法线。
我将帧数组中的值与我的 southHemisphere 数组中的值交换,然后宾果游戏 - 对象同时出现在场景和阴影贴图中!
在对值进行一些调整之后,似乎只有法线的方向与每个向量本身的方向相同时它才会起作用。
让我感到困惑的是,在我的阴影贴图着色器中,我什至不访问法线,所以为什么它们对渲染有任何影响?
这是我的阴影贴图的顶点着色器:
和片段:
编辑2:
这是我为 VAO 设置的功能
我的数组都遵循相同的形式:
从设置代码中可以看出,它由位置、颜色、法线、纹理坐标组成。
链接着色器后,我完成了这些设置:
opengl - 使用 OpenGL 和 GLSL 的基本阴影映射工件
我编写了一个关于基本阴影映射技术的简单 OpenGL 测试应用程序。
我已经移除了大多数伪影,除了封堵器背面的伪影。这个背面受到伪影的影响,因为在第一个渲染通道(阴影深度图填充)期间,我启用了正面剔除。因此,我有自阴影 z 战斗伪影。
为了解决这种问题,它在几个教程中说,光照空间中顶点位置的深度需要偏移一个非常小的偏移量,如 0.0005f。
这是我的问题的屏幕截图(为了可见性,我增加了盒子的环境光值)。这里没有深度偏移:
正如你所看到的,有一个强烈的自我阴影。
这是我在片段着色器中使用的一段代码:
现在让我们看看使用等于 0.0002f 的偏移量时会发生什么:
截图:
如您所见,自阴影减少了。现在让我们尝试使用等于 0.0003f 的偏移量:
截图:
如您所见,self-shadowinh 消失了!但是如果我放大到遮挡物和阴影之间的界限,我们可以看到一个没有阴影的区域。这个工件被称为 Peter Panning 工件。
所以这是一个奇怪的情况:为了避免自阴影伪影,我需要修改光照空间中的顶点深度值。但是深度值训练的这种修改会导致 Peter Panning 伪影!
如果我增加偏移值,问题会更糟。
更新
我还尝试添加偏移量。例如:
截屏:
自我阴影较少,但没有 Peter Panning 伪影。但不幸的是,立方体的正面出现了一些伪影。正面的阴影溢出。
如果我增加偏移量:
截屏:
自阴影伪影已经完全消失,但正面的阴影溢出更糟。
所以我想知道是否有可能在没有自阴影伪影和彼得平移伪影的情况下进行渲染?
c++ - 多个灯光阴影映射
问题是我将很少的灯光传递给着色器,但它只为第一个显示阴影。照明也适用于看不到阴影的灯。我检查了阴影贴图,它们被正确传递了。片段着色器:
opengl - 使用延迟渲染器的阴影映射(OpenGL 4.1,GLSL)
我在 stackoverflow 和一些书中阅读了几篇文章。但我在我的代码中找不到错误。我有一个延迟渲染器,并在 g 缓冲区内保存了反照率、深度和法线(包括规格)。此外,从场景顶部的光源创建了阴影贴图。
它看起来像这样:
反照率 (R8G8B8A8):
正常(R8G8B8A8):
线性深度 (F32):
来自光源的阴影贴图(线性深度)(相机上方 500 米):
好的。我的带有阴影映射的延迟着色器代码如下所示:我已经上传了行主矩阵。
顶点着色器:
片段着色器:
最后我的结果是这样的:
有人能看出我的错误吗?
部分测量结果:
ShadowCoord.xy 始终为 0.5、0.5
ShadowCoord.z 接缝为 1.0f
以下是一些变量值: