问题标签 [deferred-shading]

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 回答
2034 浏览

graphics - 是否有使用深度缓冲区的伪造抗锯齿算法?

最近我在我的 OpenGL 应用程序中实现了 FXAA 算法。我现在还没有完全理解这个算法,但我知道它使用最终图像的对比度数据来选择性地应用模糊。作为有意义的后期处理效果。B 因为我在我的应用程序中使用了延迟着色,所以我已经有了场景的深度纹理。使用它可能会更容易和更精确地找到在那里应用模糊的边缘。

那么是否有一种已知的抗锯齿算法使用深度纹理而不是最终图像来查找边缘?假货是指基于像素而不是顶点的抗锯齿算法。

0 投票
1 回答
630 浏览

opengl - 如何使用纹理作为深度附件?

我有一个带有多个渲染目标的帧缓冲区。它们都是纹理而不是渲染缓冲区。如何使用纹理A组件作为深度附件?我想使用默认的深度测试。RGBA

0 投票
1 回答
581 浏览

directx - 使用计算着色器、多个交换链进行延迟着色?

再次嗨。我准备在我的 dx11 引擎中添加延迟着色,但我有一个架构问题。我正在考虑首先使用 MRT 渲染 gbuffer,将其传递给计算着色器,调度,然后输出结果。我的问题是,我应该创建两个交换链,一个用于渲染 gbuffer,一个 uav 用于将计算着色器渲染到后台缓冲区并呈现,还是有另一种方法可以做到这一点?我在这里要避免的是必须使用全屏四边形并在其上渲染 cs 的输出。开销太大。提前致谢。

0 投票
1 回答
1162 浏览

c++ - 如何在延迟着色系统中实现光遮挡?

我正在实现一个延迟着色系统,它使用计算着色器(在 DirectX 11 中)来剔除瓦片中的灯光,因此我可以以稳定的帧速率获得数千个灯光。当我必须确定灯光是否被场景阻挡时,问题就出现了几何。我的意思是我的点光源穿过墙壁和桥梁。我在主光(太阳)的角度上有一个阴影贴图,但是为场景上的每个点光源生成一个阴影贴图需要生成一千个立方体贴图,那就是不可能。那么这个问题通常是如何处理的呢?像 Dead Space 3 和 Battlefield 3 这样的游戏在场景中有很多灯光,但它们不会流过固体物体。

0 投票
1 回答
2435 浏览

opengl - 基于平铺剔除概念问题的延迟渲染

编辑:我仍在寻找有关使用 OpenCL 或计算着色器的帮助。我宁愿继续使用 OGL 3.3 而不必处理对 OGL 4.3 和 OpenCL 1.2 的不良驱动程序支持,但无论如何我都想不出在不使用两者之一的情况下进行这种类型的着色(匹配灯光和瓷砖)。是否可以在不使用 GPGPU 的情况下实现基于切片的剔除?

我在 OpenGL 3.3 中编写了一个延迟渲染。现在我不对灯光通道进行任何剔除(我只是为每个灯光渲染一个全屏四边形)。这(显然)有大量透支。(有时约为 100%)。正因为如此,我一直在寻找在光通过期间提高性能的方法。似乎(几乎)每个人都认为最好的方法是使用屏幕空间图块来剔除场景。这是 Frostbite 2 中使用的方法。我在 SIGGRAPH 2010 期间阅读了 Andrew Lauritzen 的演示文稿(http://download-software.intel.com/sites/default/files/m/d/4/1/d/8 /lauritzen_deferred_shading_siggraph_2010.pdf),我不确定我是否完全理解这个概念。(就此而言,为什么它比其他任何东西都好,如果它对我更好)

在演示文稿中,Laurtizen 使用光量、四边形和瓷砖来筛选场景,介绍了延迟着色。根据他的数据,基于图块的延迟渲染器是最快的(到目前为止)。我不明白为什么会这样。我猜这与每个瓷砖的所有灯光都集中在一起这一事实有关。在演示文稿中,它说读取 G-Buffer 一次然后计算光照,但这对我来说没有意义。在我看来,我会这样实现:

这仍然需要对 G-Buffer 进行大量采样。我认为这样做与为每个灯光渲染屏幕对齐的四边形具有相同(如果不是更差)的性能。不过,从它的措辞来看,似乎是这样的:

但我看不出如何在不超过某些 GPU 上片段着色器的指令限制的情况下做到这一点。谁能帮我这个?似乎几乎每个基于 tile 的延迟渲染器都使用计算着色器或 OpenCL(批处理灯光),为什么会这样,如果我不使用这些会发生什么?

0 投票
0 回答
932 浏览

opengl - Opengl 延迟光照着色器

我刚开始学习 OpenGL 3.1,我正在尝试为我的引擎(框架?)实现延迟着色。我为第一阶段、照明阶段和延迟阶段编写了简单的着色器。光照阶段从延迟纹理中获取漫反射颜色并将其保存在光照纹理中。延迟阶段绘制照明纹理。在照明着色器中是一个错误,场景很奇怪。它看起来像这样,而且应该看起来像这样。灯光舞台顶点着色器:

灯光舞台片段着色器:

这就是我在光照阶段渲染的内容:

这就是我渲染它的方式:

如果您需要所有代码,请访问 www.dropbox.com/s/hvfe4v4pb1pfxb3/code.zip。

如何解决这个奇怪的问题?

0 投票
1 回答
722 浏览

opengl - 将预渲染深度纹理绑定到 fbo 或片段着色器?

在延迟着色框架中,我使用不同的帧缓冲区对象来执行各种渲染过程。在第一遍中,我将DEPTH_STENCIL_ATTACHMENT整个场景的纹理写入纹理,我们称之为DepthStencilTextureDepthStencilTexture要访问存储在不同渲染通道中的深度信息(为此我使用不同的帧缓冲区对象),我知道两种方法:
1)我将 绑定DepthStencilTexture到着色器并在片段着色器中访问它,在片段着色器中手动执行深度,例如这个

我也设置glDisable(GL_DEPTH_TEST)glDepthMask(GL_FALSE)

2)我将 绑定DepthStencilTexture到帧缓冲区对象DEPTH_STENCIL_ATTACHMENT并设置glEnable(GL_DEPTH_TEST)glDepthMask(GL_FALSE)(编辑:在这种情况下,我不会将 绑定DepthStencilTexture到着色器,以避免循环反馈,请参阅 Nicol Bolas 的答案,如果我需要深度我将使用片段着色器gl_FragCorrd.z

在某些情况下,例如绘制光量,我需要模板测试并写入模板缓冲区,我将采用解决方案 2)。在其他情况下,我完全忽略 Stencil,只需要存储在 中的深度DepthStencilTexture,选项 1) 是否比更“自然”的选项 2) 有任何优势?

例如,我对此有一个(我认为是愚蠢的)怀疑。有时在我的片段着色器中,我从深度计算 WorldPosition。在这种情况下 1) 它会是这样的

在情况 2)它会是这样的(编辑:这是错误的,gl_FragCoord.z 是当前片段的深度,而不是存储在纹理中的实际深度)

我假设gl_FragCoord.z情况 2) 将与texture(DepthStencilTexture ,uv).r情况 1) 相同,或者换句话说,存储在DepthStencilTexture. 这是真的吗?是 gl_FragCoord.z从当前绑定的DEPTH_STENCIL_ATTACHMENT还用glDisable(GL_DEPTH_TEST)and读取glDepthMask(GL_FALSE)吗?

0 投票
0 回答
1033 浏览

opengl - OpenGL,延迟着色,点光和模板通道的边界体积,光衰减

目前我正在尝试在我的引擎中实现延迟着色。我主要基于在网络上创建的一个教程(由于链接限制,我没有在此处粘贴链接:))但我也使用其他来源,并且我知道延迟着色的工作原理。我当前的实现基于计算所有灯光类型的全屏四边形上的灯光。为了获得更快的速度,我想将边界球用于带有模板通道的点光,但我有一些问题。

第一个也是最大的一个是当我希望在光通道中渲染球体以仅计算受光影响的像素。当我在模板通道中绘制球体,然后在全屏四边形上计算光时,我认为一切正常(我只有错误的球体大小,但它仅用于测试)

但是当我试图在模板通道中使用的同一个球体上渲染它时,我得到了奇怪的结果,这可能是由于纹理坐标造成的。当我不使用它们时,我的一切都是黑色的。当我使用它们时,我得到了这个

在教程中,我看到人们只渲染仅包含顶点位置的球体,一切正常,所以我不知道出了什么问题。

我还必须对教程中提供的代码进行一些更改

而且我也想知道为什么当我在球外时,这种变化会帮助我解决另一个问题(我相信你知道问题是什么,我不需要解释它)。

我想问你的最后一个问题是,仅基于光功率(即浮点数)计算球体大小和光衰减的最佳公式是什么?

0 投票
2 回答
3890 浏览

opengl - OpenGL GBuffer 法线和深度缓冲区问题

我终于让我的 GBuffer 工作了(不是真的),但现在我遇到了一些奇怪的问题,我不知道为什么。

当我在屏幕上绘制法线纹理时,法线总是向我显示(蓝色总是指向相机)。我不知道如何正确解释,所以这里有一些屏幕:

(我认为这就是为什么我的光照通道看起来很奇怪的问题)

以下是我创建 GBuffer 的方法:

这里是几何通道:

这里是几何通道着色器:

抱歉,问题/代码片段很长,但我不知道下一步该做什么,我用其他 GBuffer 实现检查了所有内容,但找不到错误。

//编辑:

好吧,看来你是对的,问题不在于 gbuffer,而在于照明通道。我玩过很多,但不能让它工作:(

这是照明通道:

如有必要,我还可以发布 sencil pass 和/或所有其他处理。

0 投票
2 回答
711 浏览

c++ - 在 HLSL 5.0 中读取和写入纹理(延迟着色)


我正在尝试在 DirectX 11 和 c++ 中实现延迟着色。我设法创建了 G-Buffer 并将我的场景渲染到它(使用“GPU PerfStudio”检查)。我在最后的照明阶段遇到困难。我无法使用 SV_Position 返回的坐标从纹理(漫反射、法线、镜面反射)中读取数据。

这是用于将光渲染为形状的像素着色器。

我用“GPU PerfStudio”检查了输入纹理是否正确绑定。

上面的代码返回了我用来清除纹理的颜色。(从我的调试中我发现它在像素位置 0,0 处的返回值)

如果我将有问题的行替换为:-

然后它在 350,300 像素位置用适当的光线形状渲染该值。

谢谢