问题标签 [ssao]

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 投票
3 回答
502 浏览

opengl - 可缩放环境遮蔽渲染问题

我正在尝试实现这个 SAO 算法

我得到以下结果:

结果

我不知道为什么我的鼻子在墙上,这似乎是一个 z 缓冲区问题。

这是我的输入值:

除了禁用深度缓冲区的 mipmap 之外,我使用的是原始着色器而不进行任何修改。

我的深度缓冲区(在不同的场景,对不起):

深度

0 投票
1 回答
435 浏览

opengl - 将 SSAO 与全局光和局部光相结合

我最近在我的引擎中实现了 SSAO(延迟着色),但我对如何将 SSAO 与全局光和局部光(点光)结合起来非常不安全。

我应该这样做:

或这个:

0 投票
0 回答
1595 浏览

xna - 计算视图空间法线而不是世界空间

我希望你能帮助解决这个问题。我目前正在使用延迟渲染器并正在尝试实现 SSAO,但这需要查看空间法线,并且我目前有世界空间法线,我正在尝试解决如何转换它们但一直卡住。

这是我的顶点着色器的主要部分,instanceTransform是世界矩阵或实例矩阵的转置,因为相同的代码也用于实例模型。

像素着色器中的正常计算是:

你能帮忙吗?

0 投票
2 回答
1088 浏览

glsl - 使用 Vulkan 在片段着色器中缓慢获取纹理

我正在做一个内核大小为 64 的 SSAO 着色器。

SSAO 片段着色器:

samplerposition 纹理具有格式VK_FORMAT_R16G16B16A16_SFLOAT并与 flag 一起上传VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT

我正在使用带有 nvidia K1100M 显卡的笔记本电脑。如果我在 renderdoc 中运行代码,这个着色器需要114 ms。如果我将其更改kernelSize为 1,则需要1 ms

这个纹理获取时间正常吗?还是我在某处设置了错误?

就像布局过渡没有经过,所以纹理是 inVK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL而不是VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL.

0 投票
1 回答
446 浏览

c++ - SSAO 阴影随着相机移动奇怪(计算 gbuffer 错误)

我正在尝试使用本教程实现此版本的 ssao:

http://www.learnopengl.com/#!Advanced-Lighting/SSAO

这是我最终得到的渲染纹理。

在此处输入图像描述

当我移动相机时,阴影似乎随之而来

在此处输入图像描述

好像我缺少相机的某种矩阵乘法。

代码

gBuffer 顶点

gBuffer 片段

SSAO 顶点

SSAO 片段

我已经阅读并看到有人有类似的问题并将视图矩阵传递到 ssao 着色器并乘以 sampleDepth:

但似乎它只会让事情变得更糟。

这是从顶部看的另一个视图,您可以看到阴影随着相机移动

在此处输入图像描述

如果我以某种方式放置我的相机,事情就会排成一行

在此处输入图像描述

0 投票
1 回答
787 浏览

c++ - OpenGL 计算来自深度缓冲区的法线和 TBN 矩阵(SSAO 实现)

我正在按照本教程在 OpenGL 中实现 SSAO:Jhon Chapman SSAO

基本上,所描述的技术使用沿片段法线定向的半球内核。然后将样本的视图空间 z 位置与其屏幕空间深度缓冲区值进行比较。如果深度缓冲区中的值较高,则意味着样本最终处于几何图形中,因此应该遮挡该片段。

该技术的目标是摆脱对象平面变灰的经典实现伪影。

我有相同的实现,但有两个小区别

  • 我没有使用噪声纹理来旋转我的内核,所以我有条带伪影,现在很好
  • 我无法访问具有每像素法线的缓冲区,因此我必须仅使用深度缓冲区来计算我的法线和 TBN 矩阵。

该算法似乎运行良好,我可以看到片段被遮挡,但我的脸仍然变灰...... IMO它来自我计算我的TBN矩阵的方式。法线看起来不错,但一定有问题,因为我的内核似乎没有正确对齐,导致样本最终出现在脸上。

屏幕截图具有 8 个样本的内核和 0.1 的半径。第一个只是 SSAO 传递的结果,第二个是生成的法线的调试渲染。

这是计算 Normal 和 TBN 矩阵的函数的代码

和 SSAO 着色器

从深度缓冲区计算的法线 SSAO 通行证

更新 1

TBN 计算函数的这种变化给出了相同的结果

0 投票
1 回答
680 浏览

c++ - Crytek SSAO 算法 OpenGL

我正在尝试实现 Crytek 屏幕空间环境遮挡算法的简单变体。

据我了解的算法;

  1. 对于像素p ,在视图空间的球体中围绕p进行采样。
  2. 将采样点sp 投影到屏幕空间。
  3. 将采样点的深度与当前像素的深度进行比较。

这基本上应该就是它的全部了。如果采样点的深度更高(它位于几何之外),它不会遮挡当前像素(p)。

下面是它的外观截图。出于某种原因,伪影仅在向下看 z 轴时出现,因此转换可能有些可疑,尽管在渲染对象和相机等时工作正常。

环境光遮挡出了问题...

基本上看任何其他角度时,您似乎希望将遮挡因子设置为 0.5(这将使您在所有颜色通道中变灰)。

没有异常

意外整数除法固定为浮点数除法后的结果。 在此处输入图像描述

在此处添加了闪烁的视频。

有什么线索吗?

编辑:四舍五入检测到一个问题。编辑:沿 z 轴移动时向工件添加了视频链接。

0 投票
1 回答
666 浏览

three.js - SSAO 的 depthTexture 不正确

最近我一直很困惑,因为我一直在尝试THREE.DepthTexture使用 Ambient Occlusion 着色器。我之前已经使用 RGBA 解包,但在阅读了 Matt Deslauriers 的项目 Audiograph 之后,我决定尝试他描述的方法来提高性能:

从历史上看,在 ThreeJS 中,您会使用 MeshDepthMaterial 将场景渲染到 WebGLRenderTarget,然后在从深度目标采样时解压缩为线性深度值。这是相当昂贵的并且通常是不必要的,因为许多环境都支持 WEBGL_depth_texture 扩展。

在尝试了这种方法之后,我以某种方式结束了这种奇怪的不良效果,其中线条遍布地形:

地形上的线

我在下面设置了一个小示例,其中复制了该问题。我觉得这是很明显的事情,我只是在掩饰。

我希望这里有人能够指出我所缺少的,以便我可以让环境光遮蔽以一种更高效的方式工作!

提前谢谢了。

我很想听听是什么导致我的环境光遮挡无法正确渲染!

0 投票
1 回答
1175 浏览

glsl - Babylon JS 和 GLSL 中的 SSAO 实现,使用 view ray 进行深度比较

我正在尝试使用 GLSL 在前向渲染(而不是后处理)中创建自己的 SSAO 着色器。我遇到了一些问题,但我真的无法弄清楚我的代码有什么问题。

它是使用 Babylon JS 引擎作为 a 创建BABYLON.ShaderMaterial并设置在 aBABYLON.RenderTargetTexture中,它的主要灵感来自这个著名的 SSAO 教程:http: //john-chapman-graphics.blogspot.fr/2013/01/ssao-tutorial.html

出于性能原因,我必须在屏幕空间中不投影和不投影的情况下进行所有计算,我宁愿使用上面教程中描述的视图射线方法。

在解释整个事情之前,请注意巴比伦 JS 使用左手坐标系,这可能对我的代码有很大影响。

这是我的经典步骤:

  1. 首先,我在我的 JS 代码中计算我的四个相机远平面角位置。它们可能每次都是常数,因为它们是在视图空间位置中计算的。
  1. 这些角位置被发送到顶点着色器——这就是向量坐标在farCorners[]数组中序列化以在顶点着色器中发送的原因。

  2. 在我的顶点着色器中,position.x标志position.y让着色器知道每次通过时使用哪个角。

  3. 然后在我的片段着色器中对这些角进行插值以计算视图光线,即从相机到远平面的矢量(因此,它的 .z 分量等于远平面到相机的距离)。

  4. 片段着色器遵循 John Chapman 教程的说明(参见下面的注释代码)。

BABYLON.RenderTargetTexture我使用该DepthRenderer.getDepthMap()方法获得了深度缓冲区。深度纹理查找实际上返回(根据 Babylon JS 的深度着色器):, (gl_FragCoord.z / gl_FragCoord.w) / far其中:

  • gl_FragCoord.z:非线性深度
  • gl_FragCoord.z = 1/WcWc剪辑空间顶点位置在哪里(即gl_Position.w在顶点着色器中)
  • far:相机到远平面的正距离。

内核样本排列在一个半球中,在 [0,1] 中具有随机浮点数,大多数分布在靠近原点的位置,采用线性插值。

因为我没有正常的纹理,所以我从当前的深度缓冲区值计算它们getNormalFromDepthValue()

最后,我的getDepth()函数允许我以 32 位浮点数获取当前 UV 的深度值:

这是我的顶点和片段着色器代码(没有函数声明):

水平和垂直的高斯着色器模糊会清除随机纹理产生的噪声。

我的参数是:

结果如下:

请点击查看我的结果

结果在其边缘有伪影,并且接近的阴影不是很强烈......有人会在我的代码中看到错误或奇怪的东西吗?

非常感谢!

0 投票
1 回答
979 浏览

opengl-es - Pure Depth SSAO 闪烁

我尝试使用本教程将 Pure Depth SSAO 实现到 OpenGL ES 2.0 引擎中。现在我经历了闪烁,这看起来像是我从某个没有数据的地方读取的。你能看到我在哪里犯了错误,或者你知道如何解决闪烁问题吗?我需要它在具有前向渲染的移动设备和 html5 上运行,这就是我使用 SSAO 的仅深度版本的原因。非常感谢

视频:优酷

GLSL 代码: