ssr屏幕空间射线追踪




本轮作业中,我们需要在一个光源为方向光,材质为漫反射 (Diffuse) 的场景
中,完成屏幕空间下的全局光照效果(两次反射)。
为了在作业框架中实现上述效果,基于我们需要的信息不同我们会分三阶段
着色,每个阶段都有相对应的任务。第一次着色负责计算 Shadow Map 所需的深
度值并保存到贴图中。第二次着色负责计算屏幕空间中,每个像素对应的世界坐
标系下位置、世界坐标系下法线、漫反射反射率和可见性信息并最终保存到对应
贴图中。第三次着色基于之前得到的场景几何信息 (像素对应的位置,法线),场
景与光源的遮挡信息 (光源坐标系的深度值),场景的材质信息 (漫反射反射率),
来计算两次反射的全局光照结果。
本轮作业的主要工作将集中在第三次着色中。

间接光照计算
codes:
/*
* Evaluate directional light with shadow map
* uv is in screen space, [0, 1] x [0, 1].
*
*/
vec3 EvalDirectionalLight(vec2 uv) {
vec3 Le = uLightRadiance*GetGBufferuShadow(uv);
return Le;
}
/*
* Evaluate diffuse bsdf value.
*
* wi, wo are all in world space.
* uv is in screen space, [0, 1] x [0, 1].
*
*/
vec3 EvalDiffuse(vec3 wi, vec3 wo, vec2 uv) {
vec3 normal = GetGBufferNormalWorld(uv);
vec3 L = GetGBufferDiffuse(uv)*max(0.0,dot(wi,normal));
return L;
}
#define MAX_RARY_MARCH_STEP 50
bool RayMarch(vec3 ori, vec3 dir, out vec3 hitPos,out int stepNum) {
float step_ = 0.1;
float len = 0.0;
//len += step_/2.0;
for(int i=0; i < MAX_RARY_MARCH_STEP; i++)
{
stepNum= i;
vec3 curPos = ori + dir*len;
len += step_;
vec2 uv = GetScreenCoordinate(curPos);
float d = GetGBufferDepth(uv);
if(GetDepth(curPos) > d+0.1){
hitPos = curPos;
//stepNum = 5;
return true;
}
if(uv.x<0.0||uv.x>1.0||uv.y<0.0||uv.y>1.0){
//stepNum = 5;
break;
}
}
return false;
}
//2 - 4
#define SAMPLE_NUM 3
void main() {
float s = InitRand(gl_FragCoord.xy);
vec2 uv = GetScreenCoordinate(vPosWorld.xyz);
//float shadow = GetGBufferuShadow(uv);
vec3 L = vec3(0.0);
vec3 wi = normalize(uLightDir);
vec3 ori = vec3(float(vPosWorld.x),float(vPosWorld.y),float(vPosWorld.z));
vec3 wo = normalize(uCameraPos - ori);
//计算直接光
L = EvalDiffuse(wi, wo, uv) * EvalDirectionalLight(uv);
//计算间接光 ssr
vec3 iL = vec3(0.0);
vec3 normal = GetGBufferNormalWorld(uv);
normal = normalize(normal);
vec3 nb1 = vec3(0.0);
vec3 nb2 = vec3(0.0);
LocalBasis(normal,nb1,nb2);
for(int i=0; i<SAMPLE_NUM; i++){
float pdf = 0.0;
vec3 ndir = SampleHemisphereUniform(s, pdf);
s = s+0.1;
s = Rand1(s);
vec3 dir = nb1*ndir.x + nb2*ndir.z + normal*ndir.y;
//dir = reflect(-wo,normal);//for test 镜面反射
dir = normalize(dir);
vec3 hitPos = vec3(0.0);
int stepNum = 0;
if(RayMarch(ori,dir,hitPos,stepNum)){
vec2 uvHitPos = GetScreenCoordinate(hitPos.xyz);
iL += EvalDirectionalLight(uvHitPos)*EvalDiffuse(wi,-dir,uvHitPos)*EvalDiffuse(dir,wo,uv) / pdf;
//iL += EvalDirectionalLight(uvHitPos)/ pdf;
//iL = EvalDiffuse(wi,-dir,uvHitPos);
//iL = EvalDiffuse(dir,wo,uv);
//iL = vec3(0.5,0.5,0.5);
}
//iL = vec3(GetDepth(ori)/100.0);
//iL = dir;
//iL = vec3(float(stepNum)/float(MAX_RARY_MARCH_STEP));
}
iL/=max(float(SAMPLE_NUM),1.0);
L += iL;
//L = iL;
vec3 color = pow(clamp(L, vec3(0.0), vec3(1.0)), vec3(1.0 / 2.2));
gl_FragColor = vec4(vec3(color.rgb), 1.0);
}
results:



todo 如果加上时域和空域的光追降噪算法,效果会更佳
ssr屏幕空间射线追踪的更多相关文章
- 基于屏幕空间的实时全局光照(Real-time Global Illumination Based On Screen Space)
目录 Reflective Shadow Maps(RSM) RSM 的重要性采样 RSM 的应用与缺陷 Screen Space Ambient Occulsion(SSAO) SSAO Blur ...
- U3D屏幕空间到世界空间变换
using UnityEngine; using System.Collections; public class FPSCam : MonoBehaviour { Vector3 lastPos; ...
- 在Unity中实现屏幕空间阴影(1)
接着上篇文章,我们实现了SSR效果. 其中的在屏幕空间进行光线追踪的方法是通用的.借此我们再实现一种屏幕空间的效果,即屏幕空间阴影. 文中的图片来自Catlike coding http://catl ...
- DirectX11 With Windows SDK--32 SSAO(屏幕空间环境光遮蔽)
前言 由于性能的限制,实时光照模型往往会忽略间接光因素(即场景中其他物体所反弹的光线).但在现实生活中,大部分光照其实是间接光.在第7章里面的光照方程里面引入了环境光项: \[C_a = \mathb ...
- 视频系列:RTX实时射线追踪(下)
视频系列:RTX实时射线追踪(下) Key things from part 4 光线有效载荷是从一个着色器传递到另一个着色器的结构. 这一切都发生在RTX的引擎下. 更小的有效载荷要好得多! 新的D ...
- 视频系列:RTX实时射线追踪(上)
视频系列:RTX实时射线追踪(上) Video Series: Practical Real-Time Ray Tracing With RTX RTX在游戏和应用程序中引入了一个令人兴奋的和根本性的 ...
- Unity3d 屏幕空间人体皮肤知觉渲染&次表面散射Screen-Space Perceptual Rendering & Subsurface Scattering of Human Skin
之前的人皮渲染相关 前篇1:unity3d Human skin real time rendering 真实模拟人皮实时渲染 前篇2:unity3d Human skin real time ren ...
- 在Unity中实现屏幕空间阴影(2)
参考文章: https://www.imgtec.com/blog/implementing-fast-ray-traced-soft-shadows-in-a-game-engine/ 完成的工程: ...
- Unity3D 屏幕空间雪场景Shader渲染
笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术详解 ...
- 将HLSL射线追踪到Vulkan
将HLSL射线追踪到Vulkan Bringing HLSL Ray Tracing to Vulkan Vulkan标志 DirectX光线跟踪(DXR)允许您使用光线跟踪而不是传统的光栅化方法渲染 ...
随机推荐
- app专项测试:app弱网测试(测试工具)
app专项测试:app弱网测试(测试工具) 除了常用的 fiddler,charles 可以模拟弱网,还有硬件工具弱网仪 HoloWAN也可以模拟弱网 使用弱网仪有以下优点:1.即插即用,无需调试和复 ...
- centos8配置网络环境及阿里云网络yum源
一.centos8配置网络环境 1.修改配置网卡配置文件 [root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens18 TYPE ...
- 【Java】关于获取注解的问题发现
同事设置了个注解,想用Spring获取的Bean来找到Class获取注解 但是发现是空的,在查看的Spring返回Bean之后,发现这个Bean对象并不是原生的实例 而是被Spring代理增强的代理对 ...
- 【转载】 在Ubuntu环境下,搜狗输入法乱码问题的解决
原文作者:高坦的博客 | Tan's Blog 原文链接:https://www.cnblogs.com/gtscool/p/12234104.html本文采用 BY-NC-SA 许可协议.转载请注明 ...
- python语言绘图:绘制一组以beta分布为先验,以二项分布为似然的贝叶斯后验分布图
代码源自: https://github.com/PacktPublishing/Bayesian-Analysis-with-Python ============================= ...
- 解决CGLib动态代理测试不通过-Unable to load cache item
1.背景 在学习aop底层时遇到的问题,做个小结 2.现象 动态代理代码如下: package com.ldp.proxy; import net.sf.cglib.proxy.Enhancer; i ...
- AI 大模型时代呼唤新一代基础设施,DataOps 2.0和调度编排愈发重要
在 AI 时代,DataOps 2.0 代表了一种全新的数据管理和操作模式,通过自动化数据管道.实时数据处理和跨团队协作,DataOps 2.0 能够加速数据分析和决策过程.它融合了人工智能和机器学习 ...
- linux中级——libcurl库访问百度
libcurl简介: libcurl是一个跨平台的网络协议库,支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议.libcurl同样支持H ...
- 1分钟掌握变速效果,让你的视频快慢自如----蓝松视频编辑SDK
2. 变速调整默认速度是1X就是正常播放速度,可以通过调节滑块,实现视频中的慢镜头动作 3.只需一行代码设置播放速度/** 视频的播放速度; 范围是 0.1---10.0 默认1.0; 正 ...
- equals与hashCode关系梳理
目录 equals用法 hashCode用法 总结 为什么一个类中需要两个比较方法 为什么重写 equals 方法时必须同时重写 hashCode 方法? Reference 这个并不是一个通用性编程 ...