问题标签 [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 投票
2 回答
1033 浏览

opengl - 延迟着色 - 多光源 (OpenGL/GLSL)

我正在开发一个延迟着色程序,现在我必须在场景中设置 50 种不同的灯光。为此,我使用以下代码随机生成其属性(位置、漫反射颜色、镜面反射颜色):

但是,我不太确定如何使用多盏灯进行照明。有人说环境光应该等于漫反射光,而镜面光应该是白色的。

调整我必须执行 Phong 照明的着色器,我有这个:

但是,我得到了丑陋的结果(如果不是错的话),如下图所示:

在此处输入图像描述 在此处输入图像描述

这个结果只使用了 2 盏灯。由于我必须使用 50,我认为我将看到的只是一个白屏......

0 投票
1 回答
352 浏览

opengl - SSAO 在 z = 0 和距离处不正确

所以我尝试实现 SSAO,但它没有按预期工作。它似乎在位置 z=0(世界空间)处分裂,在位置 z=0 处有一条白线。此外,那里的遮挡看起来也不正确。

在此处输入图像描述

再加上更远的距离,所以当移动相机时,遮挡变得更加奇怪 在此处输入图像描述

我的着色器渲染几何体(实例化):

顶点:

分段:

在几何通道之后,我应用带有法线和深度信息的 SSAO 通道。

这是我的噪声纹理: 在此处输入图像描述

我使用硬件深度缓冲区。我计算世界空间中的一切。

这是片段着色器:

0 投票
1 回答
1735 浏览

opengl - 使用 OpenGL 和 GLSL 的模板缓冲区和延迟渲染

我想知道关于在延迟渲染上下文中使用模板缓冲区的一件事:屏幕空间上的所有片段着色器是否都在“遮挡”区域内使用?

这是网站http://www.learnopengl.com/#!Advanced-OpenGL/Stencil-testing的示例(只是模板缓冲区主题,与延迟渲染无关):

在此处输入图像描述

问题:这里的“其他人被丢弃”是什么意思?这意味着在掩码采样器中的值为 0 的情况下不会调用任何像素着色器,或者对于屏幕上的每个片段,将调用像素着色器但如果值为 0,则将应用一个条件来丢弃像素的填充?

让我们假设左边的第一张图片是没有模板缓冲的结果。信息的支持是由 2 个三角形组成的四边形(我们应用延迟渲染技术,因此我们在屏幕空间中工作 - 屏幕尺寸为 500x500)。所以在光栅化之后,会调用 500 * 500 个片段着色器来填充帧缓冲区,即使在没有光线的黑暗区域,它们也会全部使用。这意味着如果我们应用 blinn-phong 着色模型,最后一个将应用在屏幕上的任何地方,甚至在黑暗区域,我认为这对性能是一种浪费。

因此,在这种情况下,合乎逻辑的做法应该是创建一个遮罩(使用模板缓冲区或使用外部自定义遮罩渲染通道,使用其他帧缓冲区来填充它),最后仅使用 blinn-phong 着色模型作为示例其中屏幕空间中掩码采样器中的像素值为 1。这样,phong 着色模型将仅在我们的示例中应用于 2 个框和平面!

在第一种方法中正确完成工作的技巧应该是在片段着色器中添加一个条件,以判断我们是否需要根据采样蒙版纹理的值来计算当前片段的 blinn-phong 着色。

但我想知道(如果我们看上面的第三张图片)是否可以告诉 OpenGL API 调用仅与彩色区域相关的片段着色器!(这意味着我们不进入片段着色器的主要部分)。在这种情况下,使用的片段着色器的数量将大大减少,并且性能会更好!或者唯一的解决方案是像我上面提到的那样在片段着色器中设置一个条件?

0 投票
1 回答
263 浏览

c++ - 他们是 Stencil Pass 的替代品吗

目前我已经使用 OpenGL 实现了延迟渲染,它现在相当简单。但是,由于目前使用模板通道(至少以我目前使用它的方式),我遇到了主要的性能问题。我主要使用 ogldev.atspace 教程(抱歉,每个帖子只有 2 个链接!)作为参考以及其他文章中的几十条信息。

它的工作原理如下:

  1. Gbuffer pass(渲染几何和填充法线、漫反射、环境等)
  2. 对于每个灯 2a) 模板通道 2b) 灯通道
  3. 换屏

问题是以这种方式使用模板通道会产生巨大的成本,因为我需要为场景中的每个灯光在光通道模式和模板模式之间切换。所以这是很多 GL 状态交换。

没有模板通道的替代方法如下所示:

  1. Gbuffer 填充
  2. 设置光通
  3. 计算所有灯光
  4. 换屏

这样做无需为场景中的每个灯光交换所有 OpenGL 状态(和缓冲区清除等)。

我已经使用 CodeXL 和基本 fps 的 std::cout'ng 对此进行了测试/分析。使用模板传递方法的状态更改函数占用了我 GL 调用的 44%(相比之下,绘制为 6%,纹理为 6%),缓冲区交换/清除等也花费了相当多的 %。当我使用第二种方法时,GL 状态变化下降到 2.98%,其他的下降幅度也相当大。FPS 也发生了巨大变化,例如我的场景中有 65~ 个灯光,动态移动。如果我在发布模式下幸运的话,Stencil Pass 给我大约 20-30 fps(渲染占用了大部分时间)。第二种方法给了我 71~ (渲染占总时间的较小部分)。

现在为什么不直接使用第二种方法呢?好吧,它会导致严重的照明问题,这是我第一次没有得到的。我不知道如何摆脱它们。这是一个例子:

第二个非模板版本(它基本上会流血并重叠在其范围之外的东西上):http: //imgur.com/BNn9SP2

第一个模板版本(它应该看起来如何):http: //imgur.com/kVGRwH2

所以我的主要问题是,有没有办法避免使用模板通道(并使用类似于第一个没有图形故障的东西)而不将算法完全更改为平铺延迟渲染之类的东西?

如果不是,他们是否是另一种延迟渲染方法,这与我正在使用的延迟渲染器的风格没有太大的区别?

摆脱模板通行证对我来说并不是一个新问题,当我第一次实现它时,我正在寻找一个替代方案,大约 6 个月前,我认为这对于我所拥有的东西来说可能有点过多的开销心里。但我当时什么都找不到,现在仍然找不到。

0 投票
1 回答
194 浏览

jquery - 带有延迟渲染的 jQuery 可排序

table我使用了一个 jQuery 插件(带有 Scroller 扩展的 DataTable),由于延迟渲染,它允许我用千行显示 HTML 。

我想做它sortable(使用可排序的 jQuery-UI 插件)。

问题是,当我拖动一个元素并想将其放得更低时,nodes表格的第一个从 DOM 中消失,而新的出现了。所以我不再能够放下拖动的元素。

一个例子比长文本更好:http: //jsfiddle.net/91dr6utg/

(在 jsfiddle.net 中尝试,代码段中允许的行太多)

如果我拖动第一个元素,我不能在第 90 个元素之后放下它。


更多信息 :

我做了start防止拖线消失的功能。node事实上,如果从 DOM 中删除原始元素,sortable插件就不能再删除元素(它不再知道它了)。所以我将它移动到另一个永远不会更新的 DOM 容器中。

如果我们删除这个函数,我们会看到原始node被删除了大约 50 行以下
=> 好的,这来自 DOM 重新生成,
但是我们仍然可以删除元素直到 90 行以下
=> 因为下一行从未在DOM,这是极限

0 投票
1 回答
359 浏览

c++ - 延迟渲染:将渲染目标作为着色器资源视图传递给着色器时出现问题


我第一次遇到一些我自己无法解决的问题时,我正在实施延迟渲染/着色:/。

当一起渲染几何通道和延迟通道时,我得到了这个看起来很奇怪的输出在此处输入图像描述

在设置拓扑、输入布局等之前,我在延迟传递的开头使用了绿色透明色。这就是绿色的来源。我不确定为什么输出图像被分成两半。

然而,我的主要问题是成功地将渲染目标从我的几何传递作为着色器资源视图传递到我的延迟着色器。这是我的几何着色器的结果 在此处输入图像描述

所以从输出图像来看,我已经看到将转换管理到正确的空间,对吗?

在我的几何传递中,我设置了我的渲染目标

在延迟传递中,我将它们设置为着色器资源视图

在我的延迟着色器中,我注册了它们

并对它们进行采样

为了获得与几何传递完全相同的输出,我写了

但我得到的只是我发布的黑色和绿色分割图像。为了调试这个,我放置了一些 if 语句,如果 float3 样本中的一个元素是 0.0f 并且所有元素都是 0.0f,则返回颜色!我真的将 gbuffer 渲染目标设置为着色器资源视图吗?

我的理解是,当 gbuffer 包含一个 ID3D11ShaderResourceView* 和一个 ID3D11RenderTargetView* 并且用于创建两者的 ID3D11Texture2D* 时,是使用D3D11_BIND_RENDER_TARGET |创建的。D3D11_BIND_SHADER_RESOURCE绑定标志,当使用渲染目标视图时,其内容会自动“复制”到 gbuffer 着色器资源视图,稍后可用作着色器的输入。

随时纠正我和/或拓宽我对该主题的视野。对我的问题有什么建议吗?谢谢!

0 投票
1 回答
783 浏览

c++ - 延迟渲染:性能问题

我刚刚第一次实现了延迟渲染/着色,我很惊讶地看到前向渲染和延迟渲染之间的巨大性能差距。

当我使用前向渲染运行我的应用程序时,我在发布模式下运行时获得了相当不错的帧速率

前向渲染 在此处输入图像描述

然而,当我使用延迟渲染运行它时,它给了我一个相当令人惊讶的输出

延迟渲染 在此处输入图像描述

我很清楚延迟渲染并不是你为应用程序涂上一层以使其“更快”运行的东西。我认为它是一种性能优化技术,可以通过多种方式进行优化,并且我知道该技术比前向渲染具有更大的内存占用。

然而...

我目前在场景中有一个点光源和一百个通过硬件实例创建的立方体。光在 Z 轴上来回移动,将光投射到立方体上。

问题是移动时光线非常滞后。它是如此滞后,以至于应用程序没有注册键盘输入。老实说,我并没有为此做好准备,我认为我在实施过程中做了一些非常糟糕的事情。

到目前为止,我已经将 gbuffers 上的纹理格式从 jsut 更改为 jsutDXGI_FORMAT_R32G32B32A32_FLOATDXGI_FORMAT_R16G16B16A16_FLOAT查看它是否有任何视觉影响,但没有。

有什么建议么?谢谢!

旁注
我正在使用Visual Studio 图形诊断程序来调试我的 DirectX 应用程序

0 投票
1 回答
313 浏览

opengl - 多重采样纹理在地平线上产生伪影

我已经实现了延迟渲染,并尝试使用多重采样纹理进行抗锯齿。

我将场景渲染为具有多重采样纹理的 FBO,使用 glBlit 在第二个 FBO 中创建常规纹理,最后将纹理绑定到生成最终图像的光照着色器。

这会在地平线(几何体和天空盒之间)产生一条可见线。颜色是清晰的颜色。只有清除深度才能减少移动时的问题。在渲染几何之前将 SkyBox 渲染到 FBO 会产生不太明显的伪影,但线条仍然存在。

编辑:忘记图片 在此处输入图像描述

0 投票
0 回答
145 浏览

opengl - 后续纹理读写问题

在我的渲染管道(OpenGL 3.3 核心)中,我有以下循环(伪代码):

n=1,一切正常。但是,当 时n=2,第一次渲染是不正确的。


我怀疑是在之前的采样完成之前render to texture T开始写的。Trender to back bufferT

glFlush()循环结束后,渲染是正确的,但是 FPS 下降了一点。在 Internet 上的任何地方,我一直在发现“如果您需要使用 glFlush(),您可能做错了什么”。

我是否正确识别了问题?glFlush()在这种情况下是正确的解决方案吗?每次迭代使用不同的纹理(我知道n)会是更好的解决方案吗?

它发生在 GTX580 上,但不在 ATI Mobility Radeon 3470 上。


我的背景 - 详细信息:

我有 2 个灯和 g-buffer (FBO)。在每次迭代中,我都使用一个灯光及其阴影贴图(另一个具有纹理的 FBO T- 所有灯光相互)进行延迟着色,其中n是多个灯光。在render to back buffer我身上积聚光。

在下图中,我没有累积光。相反,我将第一次迭代渲染到左侧视口,第二次渲染到右侧以演示问题。

分离的着色通道

0 投票
1 回答
222 浏览

opengl - 优化流媒体vbo openg

我正在使用 opengl 3.3,使用完全流式传输的 VBO 渲染一个自上而下的基于图块的世界。

在遇到一些滞后后,我做了一些基准测试,结果发现很可怕!

在此处输入图像描述

让我解释一下图片。第一个标记的方块是我使用最简单的着色器运行我的游戏。没有闪电,什么都没有!我只是上传 5000 个顶点并绘制它们。我的内存负载约为 20-30%,cpu-load 30-40%

第二个是闪电。每个灯光都作为数组上传到片段着色器,每个片段都会处理灯光。负载约 40-50%。100% 有 60 盏灯。

第三个是延迟着色。首先,我将法线和漫反射绘制到 FBO,然后将每个灯光渲染到默认 FB,同时读取这些灯光。负载约为 80%。基本上不受灯光数量的影响。

这些是我渲染的场景:

在此处输入图像描述

在此处输入图像描述

如您所见,没有什么花哨的。是复古风格。我的计划是增加大量的复杂性,并且仍然在低端计算机上运行流畅。我的是i7 nvidia 660M,所以应该没有问题。

作为比较,我运行了魔兽争霸 3,它占用了大约 50-60% 的负载,20% 的内存。

我注意到的一件奇怪的事情是,如果我禁用垂直同步并且不在交换缓冲区之前调用 glFinish,负载会显着下降。然而,时钟上升并产生热量(53C*)。

现在,首先我想知道你是否认为这是正常的。如果不是,那么我的瓶颈可能是什么?会不会是我的流媒体 VBO?我试过双重缓冲和孤立,但没有。将 sprite 的数量加倍基本上会增加 5-10% 的内存负载。GPU负载基本保持不变。

我知道这个问题不容易回答,但我会根据您的需要提供更多详细信息。不想在这里发布我的 20000 行代码。

哦,还有一件事......它会波动。绘制调用是相同的,但负载可以从 2-100% 变化,只要感觉。

更新:

我的主循环如下所示:

交换缓冲区

renderAndDoGlCalls

更新GameAndPoll

如果还有时间就睡觉(1/60 秒)

重复。

如果没有 v-sync、glflush 或 glfinsih,这会导致使用百分比:

交换:0.16934400677376027

任:0.9929640397185616

upp:0.007698000307920012

民意调查:0.0615780024631201

睡眠:100.39487801579511

在交换缓冲区之前使用 glFinish:

交换:26.609977064399082(这通常会上升到 80%)

任:1.231584049263362

upp:0.010266000410640016

民意调查:0.07697400307896013

睡眠:74.01582296063292

使用 Vsync 启动良好,通常与使用 glFinish 相同,然后是 bam!:

交换:197.84934791397393

任:1.221324048852962

upp:0.007698000307920012

民意调查:0.05644800225792009

睡眠:0.002562000102480004

它保持这种状态。