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

c++ - OpenGL 和多个纹理作为输出

尝试通过我的屏幕外缓冲区传递多个纹理时遇到问题。问题是没有正确写出其他纹理。我被分配的任务是延迟渲染 sponza 场景。

你能帮我解决这个问题吗?

创建程序:

将纹理绑定到 FBO:

构建 GBuffer:

顶点着色器:

片段着色器:

0 投票
1 回答
842 浏览

c++ - Reconstructing position from depth buffer - missing Z?

I'm implementing deferred shading in my OpenGL app, and rather than waste waaay too much memory storing position information, I want to reconstruct the view-space position in the fragment shader using information from the depth buffer. It appears as though I have correct x/y, though I'm not completely sure, but I know that my z information is out the window. Here's the part of the fragment shader responsible for reconstructing the position:

matInvProj is the inverse of my projection matrix (calculated on the CPU and uploaded as a uniform mat4). When I try to render my position information (fragColor = vec4(position, 1.0);), the screen is black in the lower-left corner, red in the lower-right corner, green in the upper-left corner, and yellow in the upper-right corner. This is roughly what I would expect to see if my depth was uniformly 0.0 across the entire scene, which it obviously should not be.

What am I doing wrong?

0 投票
0 回答
721 浏览

c++ - 从深度重建位置 - 如何处理精度问题?

在我的延迟渲染器中,我已经成功地从深度缓冲区重建了我的片段位置......主要是。通过将我的结果与存储在额外缓冲区中的位置进行比较,我注意到我在远离屏幕的地方弹出了很多内容。这是我所看到的屏幕截图:

在此处输入图像描述

顶部的绿色和黄色部分只是天空盒,其中位置缓冲区包含 (0, 0, 0),但重建算法将其解释为深度 = 0.0(或 1.0?)的正常片段。

场景是使用 渲染的fragColor = vec4(0.5 + (reconstPos - bufferPos.xyz), 1.0);,所以只要结果片段正好是 (0.5, 0.5, 0.5) 就是重建和缓冲区具有完全相同的值的地方。深度缓冲区后面的不精确是可以预料的,但是洋红色和蓝色似乎有点奇怪。

这就是我从深度缓冲区重建位置的方式:

其中texCoord = gl_FragCoord.xy / textureSize(colorBuffer, 0);matInvProj是用于渲染 gbuffer 的投影矩阵的逆矩阵。

现在我的位置缓冲区是GL_RGBA32F(因为它仅用于测试准确性,所以我不太关心带宽和内存浪费),我的深度缓冲区是GL_DEPTH24_STENCIL8(我从 得到了类似的结果GL_DEPTH_COMPONENT32,是的,我确实需要模板缓冲区)。

我的 znear 是 0.01f,而 zfar 是 1000.0f。我正在渲染一个四边形作为我的地面,它是 2000.0fx 2000.0f 大(我希望它足够大,可以与远平面夹住)。

这种不精确程度是否可以接受?人们有哪些方法可以解决这个问题?我如何重建视图/眼睛空间位置有问题吗?

0 投票
3 回答
5434 浏览

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

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

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

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

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

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

有什么想法或建议吗?

0 投票
2 回答
2769 浏览

c++ - 是否有任何适用于延迟着色的与顺序无关的透明度技术?

我已经为我的 OpenGL 引擎调查了一些与顺序无关的透明度方法,起初我想我想使用加权平均混合来最大化速度。

但是,我的引擎使用延迟着色,我需要在选择混合技术时考虑到这一点。理想情况下,我想要一种不会要求我实现前向着色以用于半透明对象的技术。

在很多情况下我需要使用透明度:

  • 草/头发(抗锯齿剪裁)
  • 玻璃(多彩混色)
  • 淡入淡出的对象
  • 烟/云
  • 水/液体(会涉及折射,我知道真正的 OIT 在这里是不可能的)
  • Sparks/Magic/Fire(不需要被点燃并且可以使用添加剂混合,不用担心这些)

为了速度,我愿意牺牲图像的正确性(因此我最初选择加权平均混合)。我不需要照亮每一层半透明物体,但我至少希望最前面的像素能够正确照亮。

我正在使用 OpenGL 3.x+ 核心上下文,所以我想避免任何需要 OpenGL 4.x 的东西(尽可能使用它),但我可以自由使用 OpenGL 2 中不可用的任何东西。 X。

我的问题是:延迟着色的最佳顺序无关透明度技术是什么?和/或:使用延迟着色时,对半透明对象进行光照/着色的最佳方法是什么?

PS有没有更好的方法来渲染不依赖于混合的抗锯齿切口(草/头发/树叶)?纯 alpha 测试往往会产生难看的锯齿。

0 投票
1 回答
104 浏览

c++ - 问题延迟着色

我只是对延迟着色有一些疑问。我已经到了拥有来自多个渲染目标的颜色、位置、法线和纹理的地步。我的问题与我接下来要做什么有关。为了确保我从纹理中获得了正确的数据,我在屏幕上放置了一个平面并将纹理渲染到该平面上。我不明白的是如何操纵这些纹理,以便最终输出被光照着色。我是否需要渲染占据屏幕的平面或四边形并将所有计算应用到该平面上?如果我这样做,我会有点困惑如何让多个灯光以这种方式工作,因为“平面”将是一个可渲染对象,因此对于每个灯光,我都需要重新渲染平面。我想错了吗?

0 投票
1 回答
1506 浏览

opengl - 根据强度计算光体积半径

我目前在计算延迟渲染器的光体积半径时遇到问题。在低光强度下,体积大小看起来是正确的,但是当光强度(以及因此半径)增加时,光体积似乎越来越小。

我正在计算光体积半径(在世界空间中),如下所示:

然后我使用这个值来缩放一个盒子。

然后在我的着色器中计算衰减,如下所示:

所以很明显我在搞乱数学。衰减应该是线性的,对吧?但是我现在如何正确计算光量的世界比例值?

PS,因为我打算使用 HDR 渲染,所以灯光颜色可以超过 (1,1,1)。

0 投票
2 回答
452 浏览

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

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

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

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


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

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


以下代码在渲染循环中。

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


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

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

感谢任何输入。

0 投票
0 回答
46 浏览

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

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

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

0 投票
1 回答
2006 浏览

c++ - OpenGL OGLDev SSAO 教程实现片段着色器产生噪声

任务背景

我试图在OGLDev Tutorial 45之后实现SSAO,该教程基于 John Chapman的教程。OGLDev 教程使用一种高度简化的方法,该方法在片段位置周围的半径内随机采样点,并根据有多少采样点的深度大于存储在该位置的实际表面深度(位置越多)来提高 AO 因子片段周围位于其前面,遮挡越大)。

我使用的“引擎”没有 OGLDev 那样的模块化延迟着色,但基本上它首先将整个屏幕颜色渲染到带有纹理附件和深度渲染缓冲区附件的帧缓冲区。为了比较深度,片段视图空间位置被渲染到另一个带有纹理附件的帧缓冲区。然后这些纹理由 SSAO 着色器进行后处理,并将结果绘制到屏幕填充四边形。两种纹理都可以很好地绘制到四边形,着色器输入制服似乎也可以,所以这就是为什么我没有包含任何引擎代码的原因。

片段着色器几乎相同,如下所示。我已经包含了一些符合我个人理解的评论。

什么有效?

  • 片段颜色纹理是正确的。
  • 纹理坐标是我们绘制并转换为 [0, 1] 的屏幕填充四边形的坐标。它们产生等效的结果vec2 texCoord = gl_FragCoord.xy / textureSize(screenColorTexture, 0);
  • (透视)投影矩阵是相机使用的矩阵,它适用于该目的。无论如何,这似乎不是问题。
  • 正如预期的那样,随机样本向量分量在 [-1, 1] 范围内。
  • 片段视图空间位置纹理似乎没问题:

片段视图空间位置

怎么了?

当我将片段着色器底部的 AO 混合因子设置为 0 时,它会平稳运行到 fps 上限(即使仍在执行计算,至少我猜编译器不会优化它:D)。但是当 AO 混合在一起时,每帧绘制最多需要 80 毫秒(随着时间的推移变得越来越慢,好像缓冲区被填满了一样),结果非常有趣和令人困惑:

ssao噪音问题

显然映射看起来很遥远,闪烁的噪声看起来非常随机,就好像它直接对应于随机样本向量。我发现最有趣的是,绘制时间仅在添加 AO 因子时大幅增加,而不是由于遮挡计算。绘制缓冲区有问题吗?