屏幕空间反射Vulkan实现

Share

简介

实时渲染中重要的一环是计算间接光照,间接光照有多种实现方式,屏幕空间反射是其中的一种,我将尝试实现屏幕空间反射,把它加进我的渲染器中。

原理

22-1


原理就是在视口空间中做简单的raymarch。
对于屏幕上任意一点( p ):

1.根据摄像机方向( L )与当前点( p )的法向( N ),计算反射方向 ( RDir = reflect(L,N) )
2.从p点出发,沿着反射的方向进行光线步进:( rayPos = p + step * RDir ),其中step为步进的长度
3.对于每次步进,比较( rayPos )和( rayPos.xy )对应屏幕空间的( z )值。
->如果相差小于一个阈值 ( eps ) 则发生相交,取该点的颜色为( p )点的反射值;
-> 否则回到第2步循环。

原理十分简单,直接出的效果也不太理想,需要根据光线步进的距离、采样点的粗糙度等因素进行衰减;同时由于是步进迭代的算法,时间开销十分大,需要考虑加速步进,如二分搜索、Hi-Z等优化方法。

实现

1.一开始实现的最原始的SSR效果如下图。步长为0.2。

ssr_0png


2.可以考虑调整步长,将步长调整为0.02时效果如下图,效果好一些,但是性能开销很大

ssr_1


3.添加根据步进距离衰减,效果可以更好一些,如下图,我使用的衰减公式为 ( weight = e^{-distance * attenuation } ),其中( distance )为光线步进的长度,( attenuation )为衰减系数。

ssr_2-1


4.尝试使用二分搜索寻找相交点,但是效果好像不明显
5.尝试根据金属度和粗糙度确定衰减,直接按照系数 ( metal * rough )再进行一次衰减,这里换了一个场景,地面是非金属,粗糙度0.5,模型大部分是金属,从图中可以看到一定的色染效果。

ssr_3 ssr_4
渲染结果 SSR texture

参考

[[OpenGL] 屏幕空间反射效果_opengl ssr-CSDN博客

文章浏览阅读9.3k次,点赞7次,收藏22次。概念引入 屏幕空间反射又称SSR,是SS系列算法之一。该算法基于延迟渲染,也就是说,在动手实现SSR前,需要具备延迟渲染相关的知识,主要包括:G-Buffer相关信息的写入,根据G-Buffer还原出位置、视线向量、法线等一系列信息等。 算法本身的原理非常简单,也就是对于屏幕空间上的物体的每个像素,根据该像素对应的法线和视线信息,求解出反射向…_opengl ssr

成就一亿技术人!

](https://blog.csdn.net/ZJU_fish1996/article/details/89007236)[Unity URP实现屏幕空间反射(SSR)

Unity版本:2022 URP版本:14.0 基础SSR很简单,更重要的是如何对其进行优化和应用。在本文中,首先完成了在视空间的SSR,然后优化到屏幕光栅空间SSR,最后加上二分和Dither。 最后更新了一下HiZ,这是优化最大的…

知乎专栏

](https://zhuanlan.zhihu.com/p/650035462)

Read more

可多路视频播放的VisionOS 媒体查看器开发

可多路视频播放的VisionOS 媒体查看器开发

开发一款能够同时播放多个视频的vision pro媒体查看器。 0:00 /0:40 1× 缘起 Vision Pro 发布时我就特别想买,毕业工作后终于有资金购入并加入Apple开发者计划,从今年五月到现在也用了快小半年,用起来确实挺爽。 但是有些痛点还是很难受,其中一个痛点就是无法同时播放多个视频音频(实际上VisionOS提供了同时播放音频的API,但是似乎我用的APP都是不遵守🤣 导致都在抢占),因此为了满足我自己的这个痛点,也学习一下Vision OS 的应用开发,甚至完成度足够的话考虑上架App Store,便有了这个目标是多视频同时播放的媒体查看器项目。 现有工作 我购买了4XVR、Infuse、Moon Player、ES 文件助手(这款只有iPad OS版,不是专供Vision OS的),这几个月体验下来,全都存在我提到的和其他APP抢占音频通道,无法同时播放的问题,其他的我的主观的体验如下: 4XVR:使用最多,用起来最舒服,格式支持很全,VR视频也能看,号称全v

By Feiran Yu