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

opengl - What should a G-Buffer commonly include in a deferred rendering process?

I am trying to implement a simple deferred renderer using OpenGL and having read various tutorials and papers describing the topic, most only offer very minimalistic or abstract description to the structure of a G-Buffer - usually containing diffuse, depth and normal buffers.

Yet even a simple graphics engine wouldn't be complete without some sort of material rendering, using textures, adjustable specular lighting and more. Adding additional buffers for all properties would obviously bloat the G-Buffer a lot so what is the preffered method of obtaining all that per-material data in the second rendering pass?

In my OpenGL implementation i use Framebuffers rendering diffuse, normal and depth to GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 and GL_DEPTH_ATTACHMENT respectively. Is there a way to even store an ID or similar for materials, preferrably in OpenGL 3.3 core?

0 投票
1 回答
138 浏览

opengl - 延迟渲染奇怪的行为

我在使用 OpenGL 实现延迟渲染引擎时遇到了一些麻烦。我可以渲染到纹理,并且所有数据对于第一遍都是正确的(计算反照率、法线和深度),但是在计算闪电的纹理(发射和镜面反射)时我遇到了一些麻烦。

这是我到目前为止所得到的:

在此处输入图像描述

问题是,正如您可能已经猜到的那样,那条线显示了我的红光和蓝光之间的某种划分。

使用 NSight 查看应该是红色(或与蓝光像素混合)的线旁边的像素的历史,我可以看到: 在此处输入图像描述

所以像素实际上被红光着色,但随后又变回蓝色,我真的不明白为什么。

这是我用来进行延迟绘图的代码:

这是我用来做点光传递的代码(上面的 DeferredPointPass 函数调用)(_pointLightMesh 是一个二十面体球体网格)

这是我用来计算我的发光贴图和镜面反射贴图的着色器:

我希望有人知道这里发生了什么,提前谢谢!

0 投票
2 回答
452 浏览

java - 使用延迟渲染,得到空白输出

因此,我正在使用 Java/LibGDX,并且正在尝试设置延迟渲染的基础知识,即将实际游戏艺术渲染到 FBO 的一个颜色缓冲区,并将相应的法线渲染到 FBO 的另一个颜色缓冲区。

(所以本质上,我想通过使用多个渲染目标来创建这个这个。)

我的问题是我的最终输出是空白的,好像没有渲染任何内容或渲染不正确。


我的着色器(顶点和片段)

我有点确定这是可行的,因为如果我只是完全正常地渲染一些精灵并将其启用到屏幕(不是 FBO),它们会渲染。


以下代码在渲染循环中。

基本思想是我正在将 FBO 的两个颜色缓冲区与 glDrawBuffers 绑定。然后我绑定两个纹理单元,游戏美术和普通游戏美术。我上面的着色器应该采用这个并将游戏艺术输出到一个颜色缓冲区,并将相应的正常艺术输出到另一个。


所以就像我说的,最终输出是空白的。我确定我创建的 FBO 是有效的,因为我检查了 glCheckFramebufferStatus。

只是当我从该 FBO 获取颜色纹理并将它们绘制到屏幕上时,它们是空白的。我不知道我哪里错了。

感谢任何输入。

0 投票
1 回答
1889 浏览

c++ - 延迟渲染天空盒 OpenGL

我刚刚实现了延迟渲染,但无法让我的天空盒正常工作。我尝试在渲染循环的最后渲染我的天空盒,我得到的只是黑屏。这是渲染循环:

下面是天空盒的渲染函数

这是天空盒的顶点着色器:

天空盒的片段着色器只是将输出颜色设置为texture(cubeMap, TexCoord). 正如您从顶点着色器中看到的那样,我将位置的z组件设置为w使其深度始终为 1。我还将深度函数设置为GL_LEQUAL使其无法通过深度测试。这不仅应该在尚未绘制其他对象的地方绘制天空盒吗?为什么会导致黑屏?

我知道我已经正确设置了天空盒,因为如果我自己绘制天空盒,它会显示得很好。

0 投票
1 回答
932 浏览

c++ - 具有光量的延迟渲染器会产生奇怪的条带

我有一个延迟渲染器,它仅在当前片段位于光源范围内时计算照明方程。我通过在我的应用程序中计算光照体积的大小并将其与其他光照信息一起发送到着色器来做到这一点。然后,我检查片段和 lightPos(每个灯光)之间的距离,并将灯光的体积用作阈值。

为简单起见,我使用线性方程(二次方程产生过大的光量)来进行光衰减。所有的光照方程都可以正常工作,但是当我使用多个光照时,我有时会看到奇怪的圆形边框,好像距离检查导致光照计算过早停止,从而导致光照突然变化。您可以在下图中看到此效果:

延迟渲染器条带

片段着色器代码如下:

衰减函数是片段位置和每个光源之间的距离的线性函数。

在这个特定的场景中,我使用了一个线性衰减值0.075,我生成的光的大小/半径为:

一些观察

当我删除距离检查时if(distance <= lights[i].Size),我没有遇到奇怪的边界问题。

如果我可视化单个光源的照明值并在distance/lights.Size获得以下 2 个图像时可视化距离:

延迟渲染器条带

看起来好像光半径/距离计算和光衰减在半径上是相似的。

当我将距离检查方程更改为if(distance <= lights[i].Size * 2.0f)(以显着增加光的半径)时,我会明显减少边界带,但如果我看起来足够近,我确实会不时看到它们,所以即使这样也不能完全消除问题。

我不知道是什么原因造成的,目前我没有选择。

0 投票
1 回答
446 浏览

c# - 如何使用延迟渲染渲染多个对象?

好吧,我在很多地方都看过,但找不到问题的解决方案,我想在多线程渲染环境中同时渲染每个对象,或者像许多人所说的那样延迟渲染。

在我尝试实现多线程之前,我当前的系统根本无法工作。

延迟渲染的想法让我很困惑,我需要一个很好的解释来说明如何制作一个系统,以延迟的方式从具有指定纹理和着色器的数组中渲染对象,因为那里没有很好的解释,只有含义关键字...

0 投票
2 回答
2159 浏览

c++ - DirectX 11 延迟渲染

大约一个月以来,我一直在尝试使用 DirectX 11 制作延迟渲染器,但没有成功。

我遇到的大多数白皮书都描述了总体实现,但不是实际实现(这是有道理的,但对于实际实现来说很糟糕——无论如何对我来说)。

我查看了几个完整的引擎实现,例如来自“Practical Rendering & Computation Direct3D 11”的源代码,https://hieroglyph3.codeplex.com/,但发现它们非常繁琐且/ 或非常复杂(涉及计算着色器)。

虽然我查看了http://rastertek.com/教程,但它们已经有一段时间没有更新了(据我所知,作者处于永久中断状态),并使用 DirectX 9/10 的主题。

在过去的几周里,我一直在尝试找到一组相对基本的实现教程,希望能站稳脚跟——相对基本的意思是几何通道的漫反射和法线,以及照明通道的点光源。

所以提出一个问题,是否有一套教程和/或示例项目来完成我上面描述的基本实现?

我对 XNA 或 OpenGL 不太感兴趣,考虑到前者是 c# 而后者不是 DirectX,或者 RasterTek 教程,因为正如我所说,它们已经过时了。

非常感谢,我很感激。

0 投票
1 回答
1516 浏览

c++ - OpenGL 多渲染目标和多重采样

在 OpenGL 中使用多个渲染目标时,我在使用显式多重采样时遇到问题。

我有 4 个渲染目标(位置、漫反射 + 不透明度、法线、镜面反射 + 指数),它们在初始几何传递期间被渲染。

这些都是附加到帧缓冲区对象的非多重采样纹理,然后使用 glDrawBuffers() 设置为渲染目标。这很好用,然后我可以稍后对这些纹理进行采样以获得照明计算所需的信息。迷人的。

没有多重采样纹理。 捷运工作正常。

我现在想尝试消除一些我得到的锯齿,所以我开始使用多重采样纹理来实现显式 MSAA。然而,当我使用多重采样纹理作为渲染目标时,似乎只有第一个渲染目标被绘制到,其余的保持空白。

具有多重采样纹理。 仅渲染到第一个绘制缓冲区。

除了更改纹理的设置、绑定和在着色器中读取的方式之外,我没有更改任何其他代码。

使用以下代码将多重采样纹理附加到帧缓冲区对象:

还附加了多重采样深度/模板纹理。

然后绑定帧缓冲区并设置绘制缓冲区

然后我像往常一样绘制几何图形。但是,当使用 apitrace 检查时,很明显只有第一个颜色附件被绘制。当我使用常规(非多重采样纹理)时,情况并非如此。

然而,所有 4 个绘图缓冲区仍然在设置中。

4 个绘制缓冲区集。

0 投票
0 回答
46 浏览

opengl - 对延迟渲染着色器设计的质疑

我正在开发一个图形引擎,并且已经运行了延迟技术,但问题是每个模型,独立于它的材质(具有自己的着色器和纹理)都使用相同的着色器渲染自己,这是该技术的第一遍将信息保存到 G-Buffer 中,第二次使用该信息进行照明部分。

中央延迟着色器应该是这样吗,还是每个模型都有自己的延迟通道,以自己的方式将信息存储在 G-Buffer 上?

0 投票
0 回答
265 浏览

webgl - 从深度重建 3D 世界位置

我正在尝试在我自己的 webGL 引擎上开发延迟渲染。我已经准备好计算闪电的一切,但我无法从深度缓冲区正确重建位置......

现在,我正在尝试使用 JS 在 CPU 上的着色器中进行计算,如果我能够获得正确的位置,则将其转换为着色器。这是JS代码:

我知道有一些无用的计算,比如当模型和视图处于同一位置时相乘,但我希望它们在那里只是为了逐步显示。

在标识处,相机面向 [0,0,-1] 世界坐标,所以当我用 MVP 矩阵变换这个坐标以获得屏幕坐标时,它应该会在屏幕中心产生一个点 [0 ,0,Z],这就是我得到的。

此时一切正常。这是我卡住的地方。我的环境与我在着色器中的环境相同,我有一个 XY ,它是屏幕坐标,还有一个 Z 。我必须将这个坐标解投影到世界坐标。我正在使用 gl-matrix 库,但它没有vec3.unproject并从外部源获取它,但我没有从中获得所需的结果 [0,0,-1]:

你可以在这里看到测试。有任何想法吗?谢谢