问题标签 [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.
opengl - 可缩放环境遮蔽渲染问题
我正在尝试实现这个 SAO 算法。
我得到以下结果:
我不知道为什么我的鼻子在墙上,这似乎是一个 z 缓冲区问题。
这是我的输入值:
除了禁用深度缓冲区的 mipmap 之外,我使用的是原始着色器而不进行任何修改。
我的深度缓冲区(在不同的场景,对不起):
opengl - 将 SSAO 与全局光和局部光相结合
我最近在我的引擎中实现了 SSAO(延迟着色),但我对如何将 SSAO 与全局光和局部光(点光)结合起来非常不安全。
我应该这样做:
或这个:
xna - 计算视图空间法线而不是世界空间
我希望你能帮助解决这个问题。我目前正在使用延迟渲染器并正在尝试实现 SSAO,但这需要查看空间法线,并且我目前有世界空间法线,我正在尝试解决如何转换它们但一直卡住。
这是我的顶点着色器的主要部分,instanceTransform
是世界矩阵或实例矩阵的转置,因为相同的代码也用于实例模型。
像素着色器中的正常计算是:
你能帮忙吗?
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
.
c++ - SSAO 阴影随着相机移动奇怪(计算 gbuffer 错误)
我正在尝试使用本教程实现此版本的 ssao:
http://www.learnopengl.com/#!Advanced-Lighting/SSAO
这是我最终得到的渲染纹理。
当我移动相机时,阴影似乎随之而来
好像我缺少相机的某种矩阵乘法。
代码
gBuffer 顶点
gBuffer 片段
SSAO 顶点
SSAO 片段
我已经阅读并看到有人有类似的问题并将视图矩阵传递到 ssao 着色器并乘以 sampleDepth:
但似乎它只会让事情变得更糟。
这是从顶部看的另一个视图,您可以看到阴影随着相机移动
如果我以某种方式放置我的相机,事情就会排成一行
c++ - OpenGL 计算来自深度缓冲区的法线和 TBN 矩阵(SSAO 实现)
我正在按照本教程在 OpenGL 中实现 SSAO:Jhon Chapman SSAO
基本上,所描述的技术使用沿片段法线定向的半球内核。然后将样本的视图空间 z 位置与其屏幕空间深度缓冲区值进行比较。如果深度缓冲区中的值较高,则意味着样本最终处于几何图形中,因此应该遮挡该片段。
该技术的目标是摆脱对象平面变灰的经典实现伪影。
我有相同的实现,但有两个小区别
- 我没有使用噪声纹理来旋转我的内核,所以我有条带伪影,现在很好
- 我无法访问具有每像素法线的缓冲区,因此我必须仅使用深度缓冲区来计算我的法线和 TBN 矩阵。
该算法似乎运行良好,我可以看到片段被遮挡,但我的脸仍然变灰...... IMO它来自我计算我的TBN矩阵的方式。法线看起来不错,但一定有问题,因为我的内核似乎没有正确对齐,导致样本最终出现在脸上。
屏幕截图具有 8 个样本的内核和 0.1 的半径。第一个只是 SSAO 传递的结果,第二个是生成的法线的调试渲染。
这是计算 Normal 和 TBN 矩阵的函数的代码
和 SSAO 着色器
更新 1
TBN 计算函数的这种变化给出了相同的结果
c++ - Crytek SSAO 算法 OpenGL
我正在尝试实现 Crytek 屏幕空间环境遮挡算法的简单变体。
据我了解的算法;
- 对于像素p ,在视图空间的球体中围绕p进行采样。
- 将采样点sp 投影到屏幕空间。
- 将采样点的深度与当前像素的深度进行比较。
这基本上应该就是它的全部了。如果采样点的深度更高(它位于几何之外),它不会遮挡当前像素(p)。
下面是它的外观截图。出于某种原因,伪影仅在向下看 z 轴时出现,因此转换可能有些可疑,尽管在渲染对象和相机等时工作正常。
基本上看任何其他角度时,您似乎希望将遮挡因子设置为 0.5(这将使您在所有颜色通道中变灰)。
在此处添加了闪烁的视频。
有什么线索吗?
编辑:四舍五入检测到一个问题。编辑:沿 z 轴移动时向工件添加了视频链接。
three.js - SSAO 的 depthTexture 不正确
最近我一直很困惑,因为我一直在尝试THREE.DepthTexture
使用 Ambient Occlusion 着色器。我之前已经使用 RGBA 解包,但在阅读了 Matt Deslauriers 的项目 Audiograph 之后,我决定尝试他描述的方法来提高性能:
从历史上看,在 ThreeJS 中,您会使用 MeshDepthMaterial 将场景渲染到 WebGLRenderTarget,然后在从深度目标采样时解压缩为线性深度值。这是相当昂贵的并且通常是不必要的,因为许多环境都支持 WEBGL_depth_texture 扩展。
在尝试了这种方法之后,我以某种方式结束了这种奇怪的不良效果,其中线条遍布地形:
我在下面设置了一个小示例,其中复制了该问题。我觉得这是很明显的事情,我只是在掩饰。
我希望这里有人能够指出我所缺少的,以便我可以让环境光遮蔽以一种更高效的方式工作!
提前谢谢了。
我很想听听是什么导致我的环境光遮挡无法正确渲染!
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 使用左手坐标系,这可能对我的代码有很大影响。
这是我的经典步骤:
- 首先,我在我的 JS 代码中计算我的四个相机远平面角位置。它们可能每次都是常数,因为它们是在视图空间位置中计算的。
这些角位置被发送到顶点着色器——这就是向量坐标在
farCorners[]
数组中序列化以在顶点着色器中发送的原因。在我的顶点着色器中,
position.x
标志position.y
让着色器知道每次通过时使用哪个角。然后在我的片段着色器中对这些角进行插值以计算视图光线,即从相机到远平面的矢量(因此,它的 .z 分量等于远平面到相机的距离)。
片段着色器遵循 John Chapman 教程的说明(参见下面的注释代码)。
BABYLON.RenderTargetTexture
我使用该DepthRenderer.getDepthMap()
方法获得了深度缓冲区。深度纹理查找实际上返回(根据 Babylon JS 的深度着色器):,
(gl_FragCoord.z / gl_FragCoord.w) / far
其中:
gl_FragCoord.z
:非线性深度gl_FragCoord.z = 1/Wc
,Wc
剪辑空间顶点位置在哪里(即gl_Position.w
在顶点着色器中)far
:相机到远平面的正距离。
内核样本排列在一个半球中,在 [0,1] 中具有随机浮点数,大多数分布在靠近原点的位置,采用线性插值。
因为我没有正常的纹理,所以我从当前的深度缓冲区值计算它们getNormalFromDepthValue()
:
最后,我的getDepth()
函数允许我以 32 位浮点数获取当前 UV 的深度值:
这是我的顶点和片段着色器代码(没有函数声明):
水平和垂直的高斯着色器模糊会清除随机纹理产生的噪声。
我的参数是:
结果如下:
结果在其边缘有伪影,并且接近的阴影不是很强烈......有人会在我的代码中看到错误或奇怪的东西吗?
非常感谢!