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

opengl - 延迟渲染中的点光源双抛物面 VSM

我一直在遵循本教程来实现延迟渲染中点光的方差阴影映射功能。

我正在使用 GLSL 3.3,左手坐标系。这是我一直在做的事情:

我将场景渲染为双抛物面图,存储深度和深度 * 深度。

结果:在此处输入图像描述

上图包含前后图。点光源在场景的中心,你可以看到它发黄光最多的地方。

然后我设置了一个全屏着色器通道。我通过将教程代码从 FX 转换为 GLSL 来做到这一点。

作者的 .fx 代码:

我翻译的 GLSL 代码:

渲染结果 在此处输入图像描述 在此处输入图像描述

现在我不知道要触摸哪里才能正确渲染阴影。有人可以为我指出吗?

0 投票
1 回答
244 浏览

opengl - 阴影映射:将世界空间像素投影到光空间

我正在用延迟着色编写阴影贴图。

这是我的定向光深度图(正交投影):

深度图

下面是我的全屏四边形着色器,用于在光照视图空间中渲染像素的深度:

渲染大小为 1280x720,深度图大小为 512x512,看起来它在我的场景中重复深度图。我认为我对坐标的预测不正确。我想看看从像素到光的深度是否正确。有人可以给我一些建议吗?

0 投票
1 回答
347 浏览

opengl - OpenGL 延迟像素化光照

我正在为体素游戏开发 3 通道延迟光照系统,但是我遇到了像素化光照和环境光遮挡问题。

第一阶段将屏幕上每个像素的颜色、位置和法线渲染成单独的纹理。这部分工作正常:

无光照基础渲染

第二个着色器计算屏幕上每个像素的环境遮挡值并将其渲染到纹理。这部分不能正常工作并且被像素化:

应用了遮挡的基础渲染

原始遮挡数据:

原始遮挡数据

第三个着色器使用颜色、位置、法线和遮挡纹理将游戏场景渲染到屏幕上。这个阶段的光照也是像素化的:

灯光

SSAO (2nd pass) 片段着色器来自www.LearnOpenGL.com的 Screen Space Ambient Occlusion 教程:

光照和最终片段着色器:

游戏中每个方块面的大小为 1x1(世界空间大小)。我尝试将这些面分成更小的三角形,如下图所示,但是没有太大的明显差异。

每个面有更多三角形

如何提高照明和 SSAO 数据的分辨率以减少这些像素化伪影?先感谢您

0 投票
2 回答
300 浏览

c++ - 如何在帧缓冲区中添加无数灯光

按照 learnopengl 教程 ( https://learnopengl.com/Advanced-Lighting/Deferred-Shading ),作者保留了 GLSL 所示的固定光量(32 盏灯):

在应用灯光时:

但我希望能够添加尽可能多的灯光,因为我的项目将有无数灯光(激光枪、篝火、爆炸),所以我做了一些更改:

GLSL:

然后我一个一个地传递值并渲染一个四边形:

并且还添加了一个新的着色器来在屏幕上渲染帧缓冲区:

但我的代码只呈现第一盏灯: 结果 谁能告诉我我做错了什么以及如何在最终结果中添加灯光?

0 投票
1 回答
271 浏览

opengl - 为延迟渲染制作位置缓冲区 - 生成纹理中的噪声

我第一次尝试实现延迟着色,但在生成缓冲区时遇到了麻烦。我已经开始尝试只制作位置缓冲区,所以这里是相关代码:

帧缓冲成功完成,我们进入主循环:

这是片段着色器:

位置缓冲区似乎很好:

在此处输入图像描述

但是,如果您查看我的着色器,我并没有给 gPosition 赋值。似乎缓冲区只是在输出 fragColor。

这是我打算做的,但它给了我错误的结果:

它确实向位置缓冲区传递了一些东西,但你会发现它很奇怪: 在此处输入图像描述

有什么问题?

编辑/解决

事实证明,我必须在片段着色器中将 gPosition 定义为 vec4。它现在完美运行。所以新的问题是为什么它现在起作用了?

0 投票
1 回答
322 浏览

opengl - 具有多种颜色附件的多采样帧缓冲区的分辨率

尝试在延迟着色之上实现抗锯齿,我尝试使用多采样渲染缓冲区,然后使用缓冲区 blit 传递解析样本。

  1. 与传统的延迟着色一样,我使用专用着色器渲染场景,发出 3 种颜色输出:

    • 职位
    • 法线
    • 漫反射和镜面反射
  2. 然后将它们用于照明计算通道,从而产生最终的场景纹理

  3. 使用简单着色器将场景纹理渲染到全屏四边形屏幕上

正如您可能猜到的那样,屏幕上的 MSAA 在渲染到屏幕时不会应用于场景纹理的内容:为了实现抗锯齿,我因此在步骤 1) 中选择使用多采样渲染缓冲区并引入了一个额外的步骤1.1) 用于分辨率。当然,多重采样仅对彩色图是必要的/有用的,而不是其他 2 个图。

我的问题和问题是,显然,只能为相同类型的附件定义具有多个渲染缓冲区/颜色附件的帧缓冲区;这意味着如果一个附件是多采样的,那么所有其他附件都必须是。

这成为解析期间位置和法线缓冲区的问题,因为抗锯齿会影响几何图形和照明。

  • 我对帧缓冲区附件的理解是否有效?
  • 有没有办法解决它,以便在 Diffuse&Specular 贴图上仍然进行多重采样,但不影响其他贴图?

上面代码示例的结果是,被照亮的对象的边缘显示出不适当的暗/黑或亮/白像素伪影,可能是因为它们的位置和/或法线在此过程中已被更改。

0 投票
0 回答
235 浏览

c++ - Opengl延迟照明中的点光源是〜180度?

我正在尝试在 OpenGL 中制作一个简单的延迟光照场景,但是在实施 1 点光照后出现问题,我得到了 180 度光照表面:

截图 1:

在此处输入图像描述

截图 2:

在此处输入图像描述

这是我的代码:

“deff_light.vers”着色器:

“deff_light.frags”着色器:

“deff_shader.vers”着色器:

“deff_shader.frags”着色器:

我做错了什么?请问有什么帮助吗?

0 投票
1 回答
45 浏览

c++ - Opengl 3/4:我可以将同一个缓冲区对象绑定到不同的目标吗

在我的具体情况下,我试图将一个顶点缓冲区对象绑定到一个统一的缓冲区对象中。

有关更多详细信息,在延迟着色的不透明对象渲染管道中,我创建了一个 G 缓冲区,然后使用光 vbo 一次渲染一个点光。

然后,我需要所有这些灯作为可用于在半透明对象的前向渲染中进行迭代的 ubo。