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)允许您使用光线跟踪而不是传统的光栅化方法渲染 ...
随机推荐
- 如何实现对ELK各组件的监控?试试Metricbeat
一.前言 开发排查系统问题用得最多的手段就是查看系统日志,ELK 是 Elastic 公司开源的实时日志处理与分析解决方案,已经为日志处理方案的主流选择. 而在生产环境中,如何针对 ELK 进行监控, ...
- Mysql函数12-DATE_FORMAT
DATE_FORMAT函数用于日期格式的转换. 1.sql查询出一列create_time select create_time from goods where id=65 2.让create_ti ...
- 【SpringMVC】05 RestFul风格
什么是RestFul风格? 一个资源定位和资源操作的风格,不是标准,也不是协议, 基于此风格的路径访问可以隐藏真实的参数传递,以提高网站的安全访问 以往的请求参数: jdbc:mysql://loca ...
- 【Shiro】01 概述 & 快速上手
什么是Shiro? Apache Shiro 是Java的一个权限安全框架 一些功能:认证.授权.加密.会话管理.与Web 集成.缓存等 Shiro官网地址:[ 点击访问 ] http://shi ...
- LogCat连接安卓手机拉取日志到本地(Unity开发版)
unity开发游戏的时候经常会碰到安卓手机真机报错/崩溃,定位问题需要拉取安卓手机上的日志到电脑上来查看. 1. unity安装的时候,勾选安卓模块(sdk这些记得勾选安装) 2. 打开对应安卓模块个 ...
- pytorch之网络参数统计 torchstat & torchsummary
参考 : https://blog.csdn.net/weixin_45292794/article/details/108227437 https://blog.csdn.net/jzwong/ar ...
- mybatis升级为mybatis-plus
1.背景 为了快速开发,需要把之前的老项目升级为mybatis-plus 2.步骤 步骤一:导入jar包 <dependency> <groupId>com.baomidou& ...
- 如何在 Recovery 中启用应用
如果因为禁用了某个应用手机无法开机,那么你需要这个方法来救命 https://xdaforums.com/t/enable-or-disable-apps-directly-from-the-file ...
- Win32封装对话框类
[主程序入口.cpp] #include <windows.h> #include <tchar.h> #include "resource.h" #inc ...
- Windows添加软件开机自启动
两种方式 1.添加快捷方式到开始菜单 打开我的电脑找到C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup 文件夹, 如果难找的话可 ...