问题标签 [deferred-rendering]

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 投票
0 回答
396 浏览

opengl - opengl中瓷砖的最小/最大深度

我正在尝试实现平铺延迟渲染,但我坚持计算每个平铺的最小/最大深度。我为此使用计算着色器。这是它的完整代码:

当我尝试运行程序时,它会在计算着色器编译中无限循环。知道为什么会出现这种情况以及如何解决吗?

编辑:所以当我尝试检查我正在使用此代码执行的计算着色器的链接状态时,我发现问题是由glGetProgramiv()函数引起的:

但是,如果我从我的着色器中删除atomicMin()一切正常。

0 投票
1 回答
3296 浏览

opengl - OpenGL中的屏幕空间边界框计算

我正在尝试实现平铺延迟渲染方法,现在我被卡住了。我正在计算每个图块(32x32)的最小/最大深度并将其存储在纹理中。然后我想为我的场景中的每个点光源(球体)计算屏幕空间边界框(边界正方形),由矩形的左下角和右上角坐标表示(参见我的应用程序中的图片)。这与最小/最大深度一起用于检查光线是否影响实际瓷砖。

问题是我不知道该怎么做。任何想法,源代码或精确的数学?

光的边界框,渲染的光量

更新 我猜你的想法

我的尝试

0 投票
2 回答
1543 浏览

opengl - 延迟照明 | 使用圆的点光源

我正在按照教程在我的 OpenGL 图形引擎中实现延迟照明机制。它工作正常,我不会遇到麻烦。

当涉及到点光源时,它表示要在灯光周围渲染球体,只让那些像素通过光照着色器,这可能会受到灯光的影响。该方法存在一些关于 cullface 和相机位置的问题,此处已详细说明。为了解决这些问题,本教程使用了模板测试。

我怀疑导致我第一个问题的方法的效率:

画一个代表光球的圆圈不是更好吗?

球体在屏幕上总是看起来像一个圆圈,无论您从哪个角度看它。任务是确定圆的屏幕位置和缩放比例。这种方法有3个优点:

  • 没有cullface问题
  • 没有camereposition-in-lightsphere-issue
  • 效率更高(顶点数量严重减少 + 无模板测试)

使用这种技术有什么缺点吗?

我的第二个问题涉及实施上述方法。圆圈的中心位置可以像往常一样轻松计算:

但是现在如何计算结果圆的缩放比例? 它应该取决于距离(相机到光线)以及透视图。

0 投票
1 回答
1431 浏览

c++ - 平铺渲染计算着色器灯光剔除和着色

我正在尝试在 OpenGL/GLSL 中实现平铺延迟渲染,但我被困在灯光剔除上。

我的 GPU 有点旧(AMD Radeon 6490m),由于奇怪的原因,当在共享变量上调用原子操作时,计算着色器以无限循环运行,因此我无法使用计算着色器计算最小和最大深度。无论如何,这不是很耗时的操作,所以我在片段着色器中进行。

然后对于每个可见点光(在视图空间中),我计算屏幕空间边界四边形。现在我想使用单个计算着色器进行灯光剔除和着色。问题是,如上所述,我无法对共享变量使用原子操作,因此我无法构建平铺灯光列表并存储平铺的灯光计数。

问题是我找不到任何其他方法来做到这一点。知道如何使用非原子来剔除和构建平铺灯列表吗?

这是我的计算着色器的伪代码:

0 投票
1 回答
1007 浏览

opengl - 使用 OpenGL 进行延迟渲染,在表面的光照边界附近出现严重像素化

问题说明

我目前正在为延迟渲染器实现点光源,并且无法确定仅在灯光边界附近明显的重像素化/三角剖分来自何处。

问题似乎是由于某处的精度损失引起的,但我一直无法找到确切的来源。法线是一种明显的可能性,但我有一个同学正在使用directx,并且以类似的方式处理他的法线,没有任何问题。

距离我们游戏单位约 2 米(64 单位/米):

deferred_full_scene

几厘米远。请注意,当我接近它时,“像素化”不会改变世界的大小。但是,如果我改变相机的方向,它似乎会游泳:

deferred_closeup

与我的前向渲染器的特写进行比较,它演示了使用 RGBA8 渲染目标所期望的球形条纹(每种颜色只有 0-255 个可能的值)。请注意,在我的延迟图片中,后墙显示出正常的球形条带:

closeup_forward

光量在此处显示为绿色线框:

light_volume_and_scene

可以看出,除非您靠近表面(在我们的游戏单位中大约一米),否则效果是不可见的。


位置重建

首先,我应该提到我正在使用一个球形网格,我只使用它来渲染屏幕中光线重叠的部分。如果深度大于或等于此处建议的深度缓冲区,我只渲染背面。

为了重建片段的相机空间位置,我从光体积上的相机空间片段中获取矢量,对其进行归一化,并按我的 gbuffer 中的线性深度对其进行缩放。这是此处讨论的方法(使用线性深度)此处(球形光量)的混合。

位置重建


几何缓冲区

我的 gBuffer 设置是:


0 投票
3 回答
5434 浏览

opengl - 从深度缓冲区和任意视图投影矩阵重建世界坐标

我正在尝试从我的延迟渲染器中的深度值重建 3D 世界坐标,但我有一段时间了。我在网上找到的大多数示例都假设了标准的透视变换,但我不想做出这样的假设。

在我的几何传递顶点着色器中,我使用以下方法计算 gl_Position:

在我的光照通道片段着色器中,我尝试使用以下方法获取世界坐标:

我认为我做对了,事实上,相机附近的物体似乎被正确点亮。但我最近意识到,当我走得更远时,物体会被点亮,就好像它们离相机比实际距离更远一样。我玩过我的光照通道并验证了我的世界坐标是唯一被错误计算的东西。

我不禁认为我的 clipSpaceLocation.z 和 clipSpaceLocation.w 是问题的根源,但我已经尝试了所有我能想到的变体来计算它们,上面的代码得到了最正确的结果。

有什么想法或建议吗?

0 投票
1 回答
1161 浏览

opengl - 延迟渲染 - 使用光体积重建点光源的位置是否有效?

位置重建

我想验证这是一个有效的方法,我没有忽略一些东西。

我正在使用一个球形网格,我只使用它来渲染屏幕中光线重叠的部分。如果深度大于或等于此处建议的深度缓冲区,我只渲染背面。

为了重建片段的相机空间位置,我从光体积上的相机空间片段中获取矢量,对其进行归一化,并按我的 gbuffer(存储为32 位 float)的线性深度对其进行缩放。这是此处讨论的方法(使用线性深度)此处(球形光量)的混合。

位置重建


绑扎

我问的原因是因为我从延迟和向前获得的光衰减结果是不同的。

延期 延期

向前 向前

当我按如下方式计算衰减时,衰减与我的相机空间位置相关联:

在这些实例中差异并不是特别明显,但是在我尝试缩放光的实例(例如,将其提高到一个功率以使其更快地淡出),效果立即变得明显。

light_atten = pow(light_atten, 2.0f)

attenpow2

我的问题可能出在其他地方,但我想验证我的位置重建方法在我忽略的某些方面没有缺陷。


编辑

按要求发布我的 gbuffer 设置。

注意:此问题发生在对整个表面具有一条法线的平面表面上,因此这不会是法线精度的损失。


最终编辑 - 解决方案

看起来这种方法实际上是有效的(正如 GuyRT 所提到的)。条带问题似乎来自我如何进行伽马校正。

对于我的前向渲染器,我只有一个循环超过 8 个灯(我不进行多次传递,仅 1 次传递),并且我在光照计算后立即应用伽马校正。

对于我的延迟渲染器,我会进行所有光照计算、后处理等,然后转换为 gamma。这里的问题是我:

  1. 在线性 RGB 空间中进行光照计算
  2. 将其存储在 RGB 空间中的纹理中(只有 8 位精度)
  3. 光照完成后,伽玛校正值并将其复制到后台缓冲区。

例如,假设两个片段的光照计算在 sRGB 空间中具有最终值 1/255 (~0.003) 和 2/255 (~0.007)(如最后所示)。RGB 空间中的这些值是 (1/255)^2.2 = ~0.000006 和 (2/255)^2.2 = ~0.00002。当这些值存储到我的光照累积纹理时,它们都存储为相同的值,0。这就是条带的原因。

将我的光照累积纹理转换为GL_R11F_G11F_B10F所产生的结果与我的前向渲染器非常接近。一旦我发现 gamma 是问题所在:sRGB 纹理,这两个问题的答案就对我有所帮助。它是否正确?以及何时调用 glEnable(GL_FRAMEBUFFER_SRGB)?.

“衰减”为 4.0 的最终结果

最后结果


额外资源

我刚刚发现这种效果被称为“Gamma Banding”,这是有道理的。这个网站有一些有用的图表这个视频有一个很好的数字演练

0 投票
1 回答
160 浏览

javascript - Defer 属性 No Src 里面什么都没有

当一个script标签有一个defer属性时会发生什么,没有srcasync属性,里面什么都没有,如:

据我了解,只是告诉页面它可以在此标签加载defer时继续呈现;script规范说它应该在标签有src属性时使用,而不是当它里面有 JavaScript 时,但是当它里面什么都没有并且没有src属性时呢?为什么会有人想要那个?

这是我学校的。它在 Moodle 页面上,版本 1,不确定是次要版本,因此页面会很大,并且会根据谁登录等而发生很大变化;请告诉我您需要哪些其他源代码来回答这个问题。

编辑 我不太清楚我在问什么。我知道在这种情况下会发生什么,但我在问为什么有人会希望它以这种方式发生。拥有一个没有 JavaScript 代码来延迟的属性似乎没用defer,所以我想知道网站设计师(大约 5-10 年前)是否可以使用一些副作用。

0 投票
0 回答
149 浏览

javascript - 延迟在移动设备中呈现网页

当我在阅读这篇文章时,我来到了一个叫做Defer Rendering.

我从中了解到的是,我可以评论最初对用户不可见的 html 页面部分,并在 5 秒后使用script.

我有一个从数据库加载相关添加列表的页面。我想提高手机的加载速度。

所以我的问题是:有人可以给我一些关于如何继续前进的工作示例吗?

还是有其他方法可以做Defer Rendering

谢谢

0 投票
2 回答
1928 浏览

c++ - 延迟渲染:在默认帧缓冲区中使用来自 Gbuffer 的深度缓冲区

我正在使用 C++ 和 OpenGL 制作一个延迟渲染应用程序。在完成几何和光通道之后,我想渲染一些粒子。但我需要对这些进行一些深度测试。所以我想要做的是使用绑定到我的 GBuffer 的深度缓冲区在绘制到默认的 OpenGL 帧缓冲区时进行一些深度测试。

我像这样制作并将深度缓冲区/纹理绑定到帧缓冲区/GBuffer

如何将 Gbuffer 深度缓冲区绑定到默认帧缓冲区以在几何过程中进行深度测试?