问题标签 [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 回答
1818 浏览

opengl - Opengl 3.3+ 使用阴影映射时阴影不正确

我正在尝试使用 OpenGL 3.3+ 在我的景观编辑器上实现阴影映射。使用一些教程,我设法让我的代码编译和运行,但整个景观都处于阴影中,除了我的景观网格的后排(最小的 z)。

我目前正在为我的光使用与相机相同的投影、视图和模型矩阵(负 z 离相机最远)。

我的投影、视图和模型矩阵的初始化(来自 LWJGL 矩阵教程):

显示场景时绑定我的矩阵:

我已经通过在片段着色器中存储颜色测试了我的 FBO,高度图正确显示(我将 FBO 纹理绘制到屏幕角落的一个小四边形)并在我更改高度图时更新。

然后我修改了我的 FBO 以在第一遍时将深度存储到纹理中:

我的第一遍顶点着色器(创建阴影贴图):

我的第一遍片段着色器:

我的偏差矩阵:

第二遍的顶点着色器(使用阴影贴图渲染场景):

第二遍的片段着色器:

0 投票
1 回答
560 浏览

3d - 阴影贴图,woo 技巧,深度剥离

我正在尝试制作一个自阴影对象(opengl/glsl)。我做的步骤是:

1- 从灯光渲染场景以获得深度图

2- 从相机位置渲染并计算每个点到光源的距离,如果点到光源的距离大于存储在深度图中的深度,则该点处于阴影中。

但随之出现了暗影粉刺的问题。所以,第二步会像:

2- ...如果(abs(DISTANCE_OF_THE_POINT_TO_LIGHT - DEPTH_STORED_IN_THE_DEPTH_MAP)> BIAS)点在阴影中。

但它仍然没有给我很好的结果(没有合适的偏差值)。

所以,我实现了 woo 技巧(从光中找到第一个和第二个表面,然后将中点存储在深度缓冲区中)。为此,我进行了两次深度剥离。步骤是:

1- 像往常一样从灯光渲染场景以获得第一张深度图。

2- 从光照渲染场景得到第二张深度图,如果一个点到光照的距离等于第一张深度图中的距离,则丢弃该点(即不渲染第一层)。

3- 存储为您的最终深度图(第一个深度图 + 第二个深度图)/2

4- 从相机位置渲染并计算每个点到光源的距离,如果点到光源的距离大于深度图中存储的深度,则该点处于阴影中。

现在问题出现在第2步,我们之前遇到的SAME问题:当第一层和第二层接近时会出现舍入误差并且还会出现某种粉刺,并且也没有合适的偏差值。所以,我没有从 woo 算法中得到任何好处,它只是将问题转移到深度剥离部分。

你怎么能解决这个问题?

0 投票
1 回答
1891 浏览

opengl - glsl 性能:tan(acos(x)) 与 sqrt(1-x*x)/x

我正在编写一个使用阴影映射的 glsl 片段着色器。按照本教程http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-16-shadow-mapping/,我写了这一行来评估 shaodw 偏差以避免阴影痤疮

但我从数学中知道

使用这样的身份而不是 tan 和 acos 会更快吗?在实践中,要使用这行代码

我认为我的问题类似于“gpu 在执行 sqrt 和除法或 tan 和 acos 方面是否更快?” ...还是我错过了什么?

0 投票
1 回答
909 浏览

opengl - OpenGL 3.3 两个 GPU 上的两个不同结果 nVidia Optimus 与阴影映射

因此,我正在使用 C++ 开发一个项目(在未来学习和创建游戏),而对于渲染,我选择了 OpenGL 3.3。我一直在研究我的处理器中内置的 Intel HD 4000,因为它会打开默认的新应用程序,一切都很顺利。但后来我尝试在我的第二个 GPU - nVidia GTX660m 上打开它,它要快得多,而且我预计它会有更多的 FPS。但是不,不仅我有几十个错误(例如 - 如果我在片段着色器中将 vec3 作为颜色输出,英特尔就可以了,但如果我没有输出 vec4,nVidia 就会完全疯狂的风格......)。当然编译时没有任何错误,所以它很难修复......

但是现在,当我解决了大部分问题时,我正在努力解决一个我无法按照我的意愿解决的问题(可能有一些肮脏的方法,但是......这不是重点)。

简而言之:我在两个 GPU 上生成有效深度图,但在 nVidia GPU 上它不是灰度的,bur red-to-black scale这非常奇怪,因为同一台机器上的相同代码(几乎)应该运行相同(也相同的 API!)。由于这个事实,我的片段着色器可能没有赶上它,并且在 nVidia 上没有检测到被照亮的区域并且它完全黑暗(至少在聚光灯下,定向光不起作用)。

图片: 使用 Intel HD4000 时的图像(来自我的 i5 ivy-bridge cpu) 从 RMB 菜单运行应用程序时使用 nVidia GTX660m 时的图像。 没有柔和的阴影

重要 - 请注意 GTX660m 上的深度图是 redToBlack 比例,而不是像 Intel GPU 上的灰度。顶部的一个来自定向光,底部的一个当然来自点光源。

我的 FragmentShader:#version 330 核心

第一部分用于定向光 - 我在 5 个点中预采样深度图,如果所有点都相同,我不会进行更多采样(早期保释 - 很多性能优化!),或者如果有些不同,我会全部采样并计算当前片段上的阴影强度.

第二部分是简单地从点光深度图采样,然后我检查到光线中心的距离以模拟手电筒效果(中心更强)。

我认为不需要更多,但如果需要,请写,我会发布所需的代码。

还 - 阴影贴图只有 16 位精度(GL_DEPTH_COMPONENT16)英特尔 HD4000 比我的 GTX660m 更快(它更强大) - 这很奇怪。虽然我认为这是因为我不画任何高多边形,只是很多非常低的多边形。我对么?

0 投票
1 回答
416 浏览

c# - 使用 XNA 3.0 的软阴影技术

我正在使用 XNA 3.0(叹气,我知道),我正在编写一个教程,该教程有助于实现一个 3d 场景,其中的对象是聚光灯照射到圆环并投射出硬边阴影。现在,我想知道在哪里可以找到帮助(教程、源代码、片段)来柔化上述阴影?

0 投票
1 回答
536 浏览

opengl - 奇怪的阴影贴图行为,我是否正确计算了我的坐标?

我为我的图形引擎编写了一个阴影贴图着色器。我遵循了这些教程: 第 1 部分和以下部分。

不幸的是,我得到的结果有点偏离。这里有一些截图。它们显示了我的场景通常的样子,启用了阴影的场景和阴影贴图的内容(请忽略中心的白色东西,这只是鸭子的几何形状)。

这就是我在片段着色器中计算坐标以对阴影贴图进行采样的方式:

lightSpacePosition 向量通过以下方式计算:

投影矩阵为:

我的阴影贴图似乎没问题,我确保渲染通道使用与我的阴影贴图通道相同的 lightSpacePosition 向量。但我不知道出了什么问题。

0 投票
0 回答
134 浏览

opengl-es - 阴影贴图:在相同的 UV 上采样

当来自相机视图的 2 个像素位于阴影贴图上的相同 UV 上时,我在 OpenGL 中使用阴影贴图时遇到问题。这是这样的:

相同 UV 问题上的阴影贴图 http://img7.imageshack.us/img7/4459/ida9.png

两个可见阴影都出现在相同 UV 中的阴影贴图上,显然侧面的阴影是问题所在。有没有办法来解决这个问题 ?

这是我的片段着色器:

谢谢。

0 投票
2 回答
1561 浏览

java - OpenGL 阴影映射双着色器

我正在尝试使用两个使用 OpenGL 和 LWJGL 的独立且不同的着色器编写一个简单的阴影映射引擎。它专门使用 VAO/VBO。旋转相机时会出现此问题。就好像阴影旋转了相机的两倍。

我首先在原点创建一个简单的立方体,并在立方体下方创建一个 2D 平面。

[因篇幅省略代码]

然后我创建了一个“太阳”(随时间移动),它使用正交投影来创建阴影贴图。

光源投影矩阵(近为1,远为100):

设置帧缓冲区/渲染缓冲区/纹理:

阴影贴图顶点着色器:

和阴影贴图片段着色器:

程序从灯光的角度渲染场景并创建阴影贴图,然后第二个渲染通道执行环境光照、镜面光照和尝试的阴影。

最终顶点着色器:

最终片段着色器:

我承认,在理解整个过程时,我觉得自己有点过头了,并且从各种来源拼凑起来。这个问题似乎很简单,但我无法弄清楚。

以下是图片:

未旋转:

在此处输入图像描述

旋转:

在此处输入图像描述

编辑:

将阴影贴图片段着色器更改为:

0 投票
1 回答
1581 浏览

java - OpenGL 3+,具有定向光的正交投影

我目前遇到来自移动(类太阳)光源的定向光影贴图的问题。

当我最初实现时,光投影矩阵被计算为 3D,阴影贴图看起来很漂亮。然后我了解到,对于我正在尝试做的事情,正交投影会更好,但我很难替换正确的投影矩阵。

正如人们所期望的那样,每个滴答声,太阳都会沿着一个圆圈移动一定的量。我使用本土的“lookAt”方法来确定正确的查看矩阵。因此,例如,白天从早上 6 点到下午 6 点出现。当太阳位于上午 9 点的位置(45 度)时,它应该查看原点并将阴影贴图渲染到帧缓冲区。正交投影似乎发生的事情是它不会“向下倾斜”到原点。它只是继续直视 Z 轴。早上 6 点和下午 6 点看起来一切正常,但例如中午 12 点,就什么也没有了。

这是我设置的方式:

原始 3D 投影矩阵:

观察方法:

正交投影(使用宽度 100,高度 75,近 1.0,远 100)我已经尝试了许多不同的值:

阴影贴图顶点着色器:

阴影贴图片段着色器:

我觉得我在这里遗漏了一些非常简单的东西。正如我所说,这适用于 3D 投影矩阵,但我希望阴影在用户环游世界时保持不变,这对于定向照明和正交投影是有意义的。

0 投票
0 回答
330 浏览

opengl - 使用 GLSL 着色器的阴影映射的奇怪行为

我已经集成了基本的阴影贴图。但是我注意到渲染有一个奇怪的行为。总而言之,阴影映射技术需要 2 个步骤。第一个从光的角度渲染场景(填充深度纹理),第二个从相机的角度渲染。这是第一步的 C++ 代码:

这是输出:

在此处输入图像描述

地上长了痘痘。但是现在,如果我删除与将顶点发送到程序着色器对应的部分下方的代码:

我有以下输出(没有痤疮):

在此处输入图像描述

这是顶点着色器:

如您所见,我将顶点转换为光(视图)位置。因此,在我的 C++ 代码中,如果我不发送(在第二种情况下)顶点,我想知道它是如何工作的!(我只是发轻MVP矩阵!)最神奇的是没有粉刺了!你如何解释这种行为?我是否像第一种情况一样将顶点发送到着色器(并找到消除地板上痤疮的解决方案)?