- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
据我了解,阴影贴图是通过从光的角度渲染场景以创建深度图来完成的。然后,从相机的 POV 重新渲染场景,并为场景中的每个点(GLSL 中的片段)计算从该点到光源的距离;如果它与阴影贴图中的内容匹配,则它在灯光中,否则它在阴影中。
我刚刚读完this tutorial了解如何使用点/全向光进行阴影贴图。
第 12.2.2 节规定:
We use a single shadow map for all light sources
然后在 12.3.6 下它说:
1) Calculate the squared distance from the current pixel to the light source.
...
4) Compare the calculated distance value with the fetched shadow map value to determine whether or not we're in shadow.
这大致就是我上面所说的。
我不明白的是,如果我们将所有灯光烘焙到一张阴影贴图中,那么我们需要与哪个灯光比较距离?烘焙到 map 中的距离不应该与任何内容相对应,因为它是所有灯光的混合,不是吗?
我确信我错过了一些东西,但希望有人可以向我解释这一点。
<小时/>此外,如果我们使用单个阴影贴图,我们如何将其混合到所有光源?
对于单个光源,阴影贴图仅存储最近物体到光源的距离(即深度图),但对于多个光源,它会包含什么?
最佳答案
你过早地缩短了句子:
We use a single shadow map for all light sources, creating an image with multipass rendering and performing one pass for each light source.
因此阴影贴图一次包含单个光源的数据,但它们只使用一张贴图,因为它们一次只渲染一个光源。
我认为这会引出你的第二个问题——光是相加的,因此你只需将多个光的结果相加即可将它们组合在一起。在 GPU Gems 的例子中,它们直接在帧缓冲区中相加,这无疑是因为当时 GPU 上可用的存储纹理采样器数量相对有限。现在,您可能想要在帧缓冲区中进行组合并直接在片段着色器中进行组合。
由于浮点舍入误差累积,您通常还应用“如果像素小于或等于阴影缓冲区中的距离加上一点点,则像素被点亮”的测试,而不是完全相等。
关于graphics - 如何对多个点光源使用单个阴影贴图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9660959/
请看下图: 蓝色框是div。现在我要做的是实现一种 2.5D 功能: 我希望灰色阴影有点像 3D。起初我想像这样将“Y”轴分配给 box-shadow 值: "box-shadow: -5px -5p
我是一名优秀的程序员,十分优秀!