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

opengl - 在阴影贴图之外进行采样会导致异常行为

当在我的灯光视图之外采样点以及因此我的阴影贴图时,我遇到了问题。每当我的阴影贴图创建时,GL_TEXTURE_WRAP 的纹理参数设置为 GL_CLAMP 或 GL_CLAMP_TO_EDGE,这就是我得到的结果:

我已经确定在这里发生的是,地图一侧有阴影的阴影贴图之外的每个点都被认为是阴影,而地图外没有阴影的一侧的每个点也被认为是无阴影的。我认为这是 GL_CLAMP 和 GL_CLAMP_TO_EDGE 的预期行为,但我在网上找到的各种阴影映射示例中没有看到这个问题。通过使用 GL_CLAMP_TO_BORDER 并设置边框颜色可以消除其中的一些问题,但这又不是我在我看过的任何示例中看到的修复。这是遮蔽聚光灯时的预期问题吗?如果是,通常的解决方法是什么?

0 投票
1 回答
483 浏览

opengl - shadowcubemap 方格图案 - samplerCubeShadow 上的 glsl texture() 忽略向量的第四个分量

我正在尝试编写点光阴影的功能。我首先让聚光灯阴影工作,但是当我切换到点光阴影(通过使用立方体贴图、从 6 个 POV 渲染深度等)时,我现在得到了一个格子图案的光(没有阴影)。有没有人对为什么会这样有任何直觉?

这是一个屏幕截图:棋盘截图

(请注意,如果仔细观察,可以清楚地看到立方体贴图正在渲染,立方体的正面正好位于三角形的右侧)

这是我的渲染通道片段着色器 glsl 代码(如果您想查看其余部分,我也可以发布,但认为这是重要的一点)

注意:我使用的是延迟光照,所以此通道的顶点着色器只是一个四边形,而 pos_tex、norm_tex 和 col_tex 来自上一个通道中生成的几何缓冲区。

谢谢!

编辑: 好的,所以我一直在玩弄它,现在纹理似乎是随机的...... 奇怪的显示截图

所以这让我觉得深度立方体只是充满了噪音?但这似乎不太可能,因为对于带有 samplerCubeShadow 的 texture() 函数返回 1.0,该点的值必须完全是该片段的深度值......对吗?另外,我将它设置为用 wasd+up+down 控制灯光的位置,并且图案随着灯光的移动而移动(当我备份时,它会变大/变暗)。这意味着这些值必须动态变化以匹配实际距离?哦,伙计,我很困惑...

编辑 2 好的,抱歉,这个问题已经失控,但我想我会继续记录我的进展,以便将来遇到类似问题的人。

无论如何,我现在发现无论我将 4d 矢量的第 4 个分量与 shadowcubemap 一起传递给纹理(),我都会得到相同的结果。就像,我什至可以输入一个常数,得到完全相同的结果。这怎么可能?

编辑 3 该死。原来这个错误与我刚才所说的任何事情都没有关系。有关详细信息,请参阅下面的答案:(

0 投票
0 回答
135 浏览

opengl - OpenGL中的阴影贴图

我对 OpenGL 中的阴影贴图有疑问。好吧,阴影看起来像这样:

http://i.stack.imgur.com/7wWm2.png

我的顶点着色器:

片段着色器:

这是我创建帧缓冲区的方式:

问题是什么?为什么物体上的阴影看起来如此糟糕?

0 投票
1 回答
250 浏览

c++ - 阴影贴图未正确投影

我在我的 OpenGL 图形引擎中实现阴影映射时遇到了麻烦。

在第一阶段,我从光线的角度将阴影贴图渲染到帧缓冲区对象(附加了深度纹理)中:

我使用函数drawSceneTree()绘制所有场景,并使用函数setTextureMatrix()将光照矩阵存储到OpenGL TEXTURE7中,内容是这样的:

然后我从相机的角度渲染场景,并使用着色器渲染阴影:

setupMatrices() 函数设置投影和模型视图矩阵。我使用函数 BindForReading(7) 将 shadowMapFBO 绑定到 OpenGL TEXTURE7 中,其内容为:

最后,顶点和片段着色器是这些:

顶点:

分段:

我将游戏角色的阴影投射到场景的所有对象中。我把它记录在一个gif中:

https://dl.dropboxusercontent.com/u/658766/captura.gif

PS:出于调试目的,阴影贴图也在屏幕上渲染,位于右上角。

0 投票
1 回答
560 浏览

c++ - OpenGL阴影映射,具有多个glDrawElements的帧缓冲区

我有一个由很多对象组成的场景,当我渲染它们时,我会遍历场景中的所有项目并在它们上调用 glDrawElements。这工作正常。但是,现在我正在实现场景的阴影映射,并且使用相同的方式绘制到阴影缓冲区。但是,只有场景中的第一个元素以正确的方式绘制到纹理,我通过将深度纹理附加到场景元素来检查这一点,您将在下面看到。

代码如下:

当我只在山对象上运行它时,这是我得到的结果图像,你可以看到它是正确的。 帧缓冲区中的山 它也单独适用于其他场景元素。我的问题是如何使用多次绘制在同一个缓冲区中毫无问题地绘制?

编辑:只是因为这里要求的是阴影着色器组件:

顶点着色器:

片段着色器:

0 投票
0 回答
890 浏览

c++ - 尝试渲染阴影贴图时,OpenGL 场景渲染为黑色

我目前正在我的应用程序中实现阴影贴图支持,并且我一直在遵循此链接中演示的程序:http: //www.fabiensanglard.net/shadowmapping/index.php

但是,我注意到他正在使用纹理矩阵来投影阴影贴图,但我想这样做而不必使用纹理矩阵。

我渲染场景的方式如下:

  • 为深度纹理设置 FBO
  • 从灯光的角度设置投影和模型视图矩阵
  • 禁用颜色蒙版和渲染场景
  • 设置阴影矩阵:shadowMatrix = bias * lightProjectionMatrix * lightModelViewMatrix
  • 将阴影矩阵与实际相机模型视图矩阵的逆矩阵相乘
  • 将 shadowMatrix 作为 mat4 统一变量发送到着色器

在我的顶点着色器中,我有一个不同的 vec4 shadowCoord 变量,它是通过将 shadowMatrix 均匀乘以 gl_ModelViewMatrix 和 gl_Vertex (shadowCoord = shadowMatrix * gl_ModelViewMatrix * gl_Vertex) 计算得出的

片段着色器与上面链接中提到的完全相同。结果显示场景完全黑色或阴影设置的任何阴影/颜色。

我假设在将偏差、lightProjectionMatrix、lightModelViewMatrix 与相机模型视图矩阵的倒数相乘时我做错了。有人可以指出我做错了什么吗?

编辑:我希望有人可以识别问题而不必由于复杂性而粘贴代码,但无论如何我都会尝试粘贴我可以粘贴的内容。对不起,如果代码是一团糟,为了简单起见,我不得不删除很多代码:

深度帧缓冲设置

FBO绑定功能

FBO 解绑功能

FBO 绑定图像功能

顶点着色器

片段着色器

}

0 投票
0 回答
58 浏览

c++ - 模型的影子随着模型旋转

在我的场景中,我有一些在定向光下渲染的模型。我目前有一个模型在它自己的轴上旋转并平移,但我遇到的问题是该模型上的阴影没有正确投影。只有不旋转的模型才有正确位置的阴影。我将如何更新灯光以使其正确投影?

对于我的通用顶点着色器:

对于我的阴影顶点着色器:

在我的构造函数中,我将定向光初始化为:

生成的截图如下:

在此处输入图像描述

在此处输入图像描述

0 投票
1 回答
487 浏览

opengl - Nvidia显卡上的阴影粉刺

我和一个合作伙伴正在 OpenGL 中进行一个小型演示。我们正在做简单的阴影映射。他使用 ATI 和 Intel HD graphics 4000,一切正常。尽管我们使用相同的代码,但我使用 GTX 560 TI 并得到阴影粉刺。 在此处输入图像描述

当我移动时,整个阴影都在闪烁。要设置帧缓冲区的深度缓冲区,我们执行以下操作:

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

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

我尝试了不同的偏差值,但要么不影响粉刺,要么根本没有阴影。我还尝试使用带有 textureProj() 和 texture() 的 sampler2DShadow 作为查找函数。似乎没有任何效果。这个问题不仅会影响阴影,还会影响同时使用阴影贴图的体积光照效果。另一方面,使用 gl_ClipDistance 进行剪辑在我的 Nvidia 上运行良好,但在他的显卡上却不行。

0 投票
1 回答
1600 浏览

c++ - 阴影贴图透视锯齿

当表面几乎平行于光的方向时,似乎不可能消除这种透视锯齿。

我测试了几种不同的暗影粉刺去除技术:

  • 恒定偏差不起作用:在足够大的偏差上引入彼得平移以消除问题
  • 斜率偏差不能完全起作用,只会稍微减轻问题
  • 正常偏移阴影不起作用,并引入额外的阴影变形
  • glPolygonOffset 不起作用,我怀疑它与斜率比例偏差相同
  • PCL 只是稍微消除了图案的锯齿,实际上并没有解决问题。消除模式所需的过滤量会产生巨大的斑点阴影
  • VSM 做的不多,只是稍微改变了模式
  • 增加阴影贴图分辨率和像素深度可以减轻问题,但分辨率足够大以完全解决问题会显着降低帧速率
  • 为创建阴影贴图扩展投影变换的近平面和远平面也无济于事

从我在谷歌和我的书中可以找到的所有内容来看,这基本上是一个无法解决的问题。不过我知道一定有办法绕过它,因为即使是一些独立游戏也有完美而平滑的阴影贴图阴影。

有人愿意分享这个严密的秘密吗?

0 投票
1 回答
570 浏览

directx - 阴影映射伪影

我刚开始搞乱阴影贴图。我了解使用的算法。问题是我一生都无法弄清楚我在 HLSL 代码中搞砸的地方。这里是:

我已经验证我的所有矩阵都是正确的,并且深度图绘制正确。重写了所有处理此代码的 C++ 并使其更整洁,但我仍然遇到同样的问题。我目前没有混合阴影,只是将它们绘制为纯黑色,直到我可以正确绘制它们。灯光使用正交投影,因为它是定向灯光。我没有足够的信誉点来嵌入图像,但这里是 URL: 深度图 - http://i.imgur.com/T2nITid.png 程序输出 - http://i.imgur.com/ae3U3N0.png

任何帮助或见解将不胜感激,因为它适用于学校项目。谢谢