问题标签 [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.

0 投票
1 回答
2303 浏览

opengl - 使用 OpenGL 和 GLSL 的阴影映射“阴影痤疮”伪影

我编写了一个简单的 3D 应用程序,使用著名的正面剔除技术实现硬和 PCF 阴影映射算法。不幸的是,这种技术的问题是只有密封的网格会产生投射阴影。例如,平面不能产生这样的效果,因为平面本身就是正面。

因此解决方案是使用函数“glPolygonOffset”,其目标是在“光照视图”可见的每个顶点的深度渲染路径期间稍微修改深度值。换句话说,需要此功能来避免“阴影痤疮”伪影,此时保持所有网格正面。

这是使用硬阴影映射算法进行此类渲染的显示:

在此处输入图像描述

如您所见,阴影渲染非常完美,没有任何伪影!

这是定义深度纹理渲染路径的 C++ 客户端代码:

现在片段着色器代码中用于计算第二个渲染路径期间的阴影因子的代码:

“ShadowCoords”统一变量是光照空间中的顶点位置,“索引”是光照索引。

但是现在我在使用 PCF 阴影映射算法(一个有 4 个样本的示例)时遇到了问题,在第一条路径中还使用了函数“glPolygonOffset”:

在此处输入图像描述

如您所见,我们可以清楚地看到“暗疮”伪影!

这是我的片段着色器中的代码:

'textureProjOffset' 代码等于以下代码:

只有 'textureProjOffset(shadowSampler, ShadowCoords[index], ivec2(0, 0))' 的调用才能正常工作(当然它指的是第一个硬阴影映射技术)。

如果我只使用以下调用(所以一个简单的硬阴影映射但使用偏移):

我有以下渲染:

在此处输入图像描述

如您所见,仅在立方体的右面上有“阴影痤疮”伪影!

为了解决我的问题,我尝试了几种代码组合,添加了一些偏差值来处理光空间中的顶点深度值,但没有任何成功。

0 投票
1 回答
185 浏览

c++ - 阴影贴图:整个网格处于阴影中,根据深度图应该在哪里没有光

第一次尝试使用 openGL ang glsl 着色器语言实现阴影贴图。我认为我渲染到纹理的第一遍是正确的,但是当我比较深度值时,它似乎掩盖了一切。

https://www.dropbox.com/s/myxenx9y41yz2fc/Screenshot%202014-12-09%2012.18.53.png?dl=0

我的透视投影矩阵如下所示:

初始化帧缓冲区的函数

每个网格的绘制函数。模型矩阵作为参数从 Transform 类绘制函数传递

我的渲染循环

通过 1 个顶点着色器

通过 1 个片段着色器

通过 2 顶点着色器

通过 2 片段着色器

0 投票
1 回答
2247 浏览

opengl - 带有延迟渲染的阴影映射

我正在尝试实现一种阴影映射技术,但我遇到了一些问题才能使其正常工作。

我在灯光的位置有一个相机,这是我得到的阴影贴图。所有的顶点都乘以 each modelViewProjectionMatrix

相机灯的视图

我还有一个带有顶点世界位置的纹理。这是一个GL_RGBA32F纹理,因为所有的点都被每个点相乘ModelMatrix以得到世界空间中的点。

在此处输入图像描述

和着色器:

输出(摄像头几乎在灯光的同一位置):

在此处输入图像描述

我只是想看看每个顶点的投影是否正确地从相机的位置开始,但看起来不是。这一切的重点是比较:

但它也不起作用。

我将不胜感激任何帮助。谢谢你。

0 投票
0 回答
122 浏览

c++ - 阴影映射:如何从第一遍生成纹理(渲染到深度帧缓冲区)?

我正在使用定向光生成一个简单的场景。我的目标是通过阴影映射创建场景的阴影。我一直在寻找有关此主题的帮助,但无济于事。据我所知,我的代码应该与我在多个教程中看到的相同。

场景创建完美,没有阴影。我怀疑这是在我的程序的第一次渲染过程中生成(或不生成)的阴影贴图纹理的问题。当我将渲染纹理绘制到四边形时,四边形全是白色的。

我的缓冲区/纹理初始化代码如下所示:

我的显示功能。( pass = 1, if(pass == 1) 的东西似乎有点多余,但它是用于调试的)。

最后,我尝试使用以下函数将纹理绘制到屏幕填充四边形:

我知道很多人遇到的一个问题是同时将相同的纹理绑定到帧缓冲区和活动纹理。我很确定我已经避免了这种情况。

如果需要更多细节,我将非常乐意发布更多代码(包括着色器)。感谢您的帮助,因此在此先感谢您!

0 投票
1 回答
2149 浏览

three.js - 在 WebGLRenderer 中动态打开/关闭抗锯齿和阴影

如何在 WebGLRenderer 中动态打开和关闭抗锯齿和阴影?

简单地改变抗锯齿和 shadowMapEnable 的属性是行不通的。我查看了源代码并找到了一个方法 updateShadowMap () 但它在版本 69 中被删除了。

更新:好的,我在这里找到的问题后半部分的答案 https://github.com/mrdoob/three.js/issues/2466

因此,以下代码可以正常工作:

0 投票
1 回答
130 浏览

c++ - OPENGL Texture2D 直接/间接操作

按照本教程,我将在 3D 场景上执行阴影映射。现在我想在使用 ARB 扩展应用它之前操作shadowMapTexture的原始纹素数据(见下面的摘录)

  • 注意我只使用 OpenGL 2.1。
0 投票
1 回答
2472 浏览

c++ - OpenGL 中的阴影映射

我无法让阴影映射在我的应用程序中工作。我尝试渲染一辆四轮摩托车并在其下方的地板上查看它的影子。这是我的一些代码。纹理创建:

渲染到深度纹理:

我还使用渲染深度纹理的“测试”着色器程序。这是它的样子。 图片

所以我想我到现在都很好。现在我正常渲染场景。

我的顶点着色器的相关部分:

我的片段着色器的相关部分:

现在的问题是我得到了一个完全黑暗的场景,就好像它被阴影覆盖了一样。只有当灯光真正靠近四轮摩托车时,它才会正常渲染。(深度纹理在右侧可见,因为它是用不同的程序渲染的。我用它来测试) 场景

我究竟做错了什么?

0 投票
0 回答
1037 浏览

opengl - 如何为阴影映射生成 Spotlight 投影矩阵?

我目前正在为 Ogre3d 制作一个简单的小 shaodw 映射系统。我目前停留在将阴影贴图纹理映射到对象以进行深度比较,因为我不知道如何生成所需的投影矩阵,该矩阵允许我从当前片段的 3d 坐标中获取 Shadowtexture 的 2D UV 坐标。那么如何从光/光相机的位置、方向、Fov/Angle 和 Frustum 生成投影矩阵?

0 投票
0 回答
388 浏览

opengl - 方差阴影贴图深度问题

我一直在尝试让方差阴影映射在我的 webgl 应用程序中工作,但我似乎遇到了一个可以使用一些帮助的问题。简而言之,我的阴影似乎在比我在那里看到的例子更小的距离上变化。即阴影范围是从 0 到 500 个单位,但在 5 个单位之外的阴影是黑色的,在 10 个单位之外几乎不存在。我下面的示例基于这两个链接:

Florian Boesch 的 VSM

Fabian Sanglad 的 VSM

在这两个示例中,作者都​​使用聚光灯透视投影将方差值映射到浮点纹理。在我的引擎中,到目前为止,我一直尝试使用相同的逻辑,但我使用的是定向光和正交投影。我尝试了这两种技术,结果对我来说似乎总是一样的。我不确定这是否是因为我使用正交矩阵进行投影 - 我怀疑可能是。这是问题的图片:

VSM 问题

请注意,盒子距离圆圈只有几个单位,但即使相机阴影为 0.1 到 500 单位,阴影也更暗。

在光影通道中,我的代码如下所示:

然后在我的影子通道中:

首先,我是否应该对正交投影做任何不同的事情(它可能不是这个,但我不知道使用上述两种技术会发生什么:()?如果不是,我能做些什么来得到更均匀的阴影蔓延?

非常感谢

0 投票
0 回答
254 浏览

opengl - 分层渲染到立方体贴图中

我正在尝试使用立方体贴图计算阴影。为了生成这些,我使用了分层渲染,这样我就可以一次生成立方体贴图。我很想附上一些代码,但它是完整的 Haskell 和我自己的引擎,不确定这是一个好主意。但是,这是 GLSL 代码:

ligIRad是光半径的倒数。因此,生成的贴图(它不是标准深度图)存储 [0;1] 中 6 个面的每个像素的距离光点,其中 0 = 0 和 1 = 光的半径。这个技巧使我能够使用 (1,1,1,1) 清除颜色贴图,然后在光照阶段使用立方体贴图,只需使用传统方向获取纹素并将获取的.r值乘以光的半径即可恢复世界空间距离。

但是,我有一个黑色立方体贴图。我将不使用的颜色 (R) 立方体贴图和深度立方体贴图附加到 FBO。我认为附加渲染缓冲区会导致 FBO 不完整(是因为渲染缓冲区不是分层渲染友好的吗?)。

最后一个问题:有人告诉我,将分层渲染到立方体贴图中存在一个错误。有关系吗?是否有此类错误的链接?