问题标签 [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.
c++ - 阴影贴图定位和分辨率
我目前正在学习 C++ 和 OpenGL,想知道是否有人可以引导我了解以下代码到底发生了什么。它目前计算 3D 环境中阴影贴图的定位和分辨率。
该代码目前有效,只是想掌握一些东西。
c++ - 我的影子是正确的,但剪掉了
我目前正在为我的游戏引擎开发阴影贴图实现,它似乎可以很好地渲染和投射阴影贴图,但如果阴影距离发射器太近,它似乎被切割了,如下图所示
:(白线用于检查阴影是否在正确的位置,它们从聚光灯原点投射到立方体的顶点)。
如您所见,阴影已被剪切,因为它应该从地板上立方体的边缘开始。
我正在使用一个 256*256 depth16 的阴影贴图,它是从带有透视矩阵的光点渲染的:NzMatrix4f::Perspective(lightComponent.GetOuterAngle()*2.f, 1.f, 2.f, lightComponent.GetRadius())
这最终为我们提供了以下投影矩阵:
我发现减小 zFar 值可以稍微改善阴影:
zNear = 0.1,zFar = 1000
zNear = 0.1,zFar = 500
我认为问题来自测试,虽然我不知道我做错了什么。
这是着色器代码(投影阴影时):
顶点着色器:
片段着色器:
这是我为展示这个错误而制作的视频,聚光灯从立方体投射阴影(两者都没有移动)并且我正在让地板下降,一旦距离足够大,阴影似乎会自行修复:
我错过了什么吗?
opengl - MVP 矩阵的 CPU 与 GPU 浮点精度
我有一个问题,我认为是由于 CPU 上的浮点错误。
我目前正在研究阴影贴图,起初我在 GPU 上进行了 MVP 计算,例如
这显然不是所有着色器代码,但这些计算得到了以下结果:
然后我想稍微优化一下代码并将 MVP 计算转移到 CPU 并将其作为统一传递给着色器,如下所示:
这些是结果:
几个小时以来,我一直在查看我的 CPU 矩阵乘法,所以我 > 90% 确定那里的一切都是正确的。
我为容器类提供了带有集合函数的矩阵,并使用单个 getter 检索它们。
所以..关于可能是什么问题的任何想法?会不会是浮点错误?感谢您的所有回复!
directx-11 - DirectX11 和光栅化深度偏差
我在移动定向光投射阴影时遇到了 Z-fighting 问题。
在渲染阴影贴图时,我正在尝试修改光栅化器配置。有三个与深度偏差相关的字段(DepthBias、SlopedScaleDepthBias、DepthBiasClamp),无论我如何修改它们,我都找不到一个好的值——我不知道什么值范围是合适的。
是否有适用于大多数场景的普遍接受/“标准”的倾斜比例/偏差值集?我意识到有极端情况,但我只想让一般情况正常工作。
opengl - 你如何修复摆动的阴影边缘?
我已经实现了一个全方位的阴影贴图,我注意到阴影上有一个相当不受欢迎的行为。似乎当被遮挡的点和光源之间的角度真的很陡峭时,阴影的边缘开始摆动。它几乎看起来像是在搏动。
当光源远离被遮挡的多边形时,与我采样的阴影贴图面上的相应纹理像素相比,彼此相邻的像素彼此之间的距离更远,这可能与它有关吗?执行混叠时的放大副作用?这只是一个非常疯狂的猜测!
是否有人熟悉这种行为和/或有任何解决方案?
three.js - 更改分辨率时如何动态更新THREE.js中Shadow Map的分辨率?
我想在 THREE.js 中动态更改聚光灯阴影的分辨率。 这个问题首先看起来很相关,但与我的问题无关。我动态更改了阴影贴图的参数,但这不会影响场景。即使在此之后添加更多网格对象,它也不会影响场景/灯光中的阴影。当我使用初始值 (256,256) 时,它会应用,但不会在显示场景后应用。
我尝试了以下方法,但没有奏效:
当我更改 light.position 时,阴影会更新,但结果不会更新。似乎仅在初始化期间在开始时使用 .shadowMapWidth 属性。
c++ - 空(白色)帧缓冲区 - 阴影映射
请参阅编辑,因为问题的第一部分已解决。
我正在尝试使用我自己的框架从http://learnopengl.com/#!Advanced-Lighting/Shadows/Shadow-Mapping复制阴影映射演示,但有趣的是我没有得到任何阴影。第一个重要问题是我的深度图无法正常工作。我已经调试并仔细检查了每一行,但没有成功。也许另一双眼睛会有更大的成功。
我将写第二个渲染通道,因为第一个似乎不起作用。顺便说一句,对象的中心是 0,0,0。以下代码用于第一个渲染通道:
我已经测试了视图矩阵和投影矩阵生成提供的结果与 GLM(opengl 的数学库)完全相同。但是,我的正交矩阵定义为:
framebuffer对象和纹理的初始化如下:
片段和顶点着色器如下所示。
编辑:
睡了一会儿,我发现我的渲染器有一点错误,着色器绘制了一个“漂亮”的深度图。
但是,看起来纹理映射(深度比较)在同一个坐标系中。
第二个渲染过程的顶点和片段着色器看起来像
和
opengl - 后续纹理读写问题
在我的渲染管道(OpenGL 3.3 核心)中,我有以下循环(伪代码):
时n=1
,一切正常。但是,当 时n=2
,第一次渲染是不正确的。
我怀疑是在之前的采样完成之前render to texture T
开始写的。T
render to back buffer
T
在glFlush()
循环结束后,渲染是正确的,但是 FPS 下降了一点。在 Internet 上的任何地方,我一直在发现“如果您需要使用 glFlush(),您可能做错了什么”。
我是否正确识别了问题?glFlush()
在这种情况下是正确的解决方案吗?每次迭代使用不同的纹理(我知道n
)会是更好的解决方案吗?
它发生在 GTX580 上,但不在 ATI Mobility Radeon 3470 上。
我的背景 - 详细信息:
我有 2 个灯和 g-buffer (FBO)。在每次迭代中,我都使用一个灯光及其阴影贴图(另一个具有纹理的 FBO T
- 所有灯光相互)进行延迟着色,其中n
是多个灯光。在render to back buffer
我身上积聚光。
在下图中,我没有累积光。相反,我将第一次迭代渲染到左侧视口,第二次渲染到右侧以演示问题。
glsl - Cubemap PCF:在给定点获取垂直于矢量的平面
我正在尝试为 OpenGL 2.0 中的阴影立方体贴图实现 PCF。我想我在这里找到了一个解决方案(搜索Percentage closer filtering (PCF) algorithm
以找到立方体贴图 PCF 部分的开头),但代码依赖samplerCubeShadow
于 OpenGL 2.0 中不可用的那个,所以我不能使用texture(samplerCubeShadow(), vec4())
显示的调用页。
这个问题的第一部分是:有没有办法从samplerCube
OpenGL 2.0/GLSL 1.10 中检索相同的结果?通过使用 atextureCube
或其他东西?
第二部分涉及我必须解决这个问题的想法。下图说明了我想做的事情。
蓝色实线和红色虚线都是来自samplerCube
存储我的深度值的一个面的向量。蓝线与黑色方块中心的深灰色方块的交点代表立方体的采样点。我想创建一个垂直于蓝色矢量的平面(由浅灰色矩形表示)。然后我想通过将 Z 向量从灯光位置(这些是红色虚线)投射到该平面上的 x、Y 值来从相机中采样 4 个黑点。之后,我将使用这些值与原始样本的值相结合来计算 PCF 阴影值。
这是为点光源/立方体贴图计算 PCF 的可行且有效的方法吗?我将如何创建平行平面,然后从中检索我需要的 X 和 Y 坐标?