本轮作业中,我们需要在一个光源为方向光,材质为漫反射 (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屏幕空间射线追踪的更多相关文章

  1. 基于屏幕空间的实时全局光照(Real-time Global Illumination Based On Screen Space)

    目录 Reflective Shadow Maps(RSM) RSM 的重要性采样 RSM 的应用与缺陷 Screen Space Ambient Occulsion(SSAO) SSAO Blur ...

  2. U3D屏幕空间到世界空间变换

    using UnityEngine; using System.Collections; public class FPSCam : MonoBehaviour { Vector3 lastPos; ...

  3. 在Unity中实现屏幕空间阴影(1)

    接着上篇文章,我们实现了SSR效果. 其中的在屏幕空间进行光线追踪的方法是通用的.借此我们再实现一种屏幕空间的效果,即屏幕空间阴影. 文中的图片来自Catlike coding http://catl ...

  4. DirectX11 With Windows SDK--32 SSAO(屏幕空间环境光遮蔽)

    前言 由于性能的限制,实时光照模型往往会忽略间接光因素(即场景中其他物体所反弹的光线).但在现实生活中,大部分光照其实是间接光.在第7章里面的光照方程里面引入了环境光项: \[C_a = \mathb ...

  5. 视频系列:RTX实时射线追踪(下)

    视频系列:RTX实时射线追踪(下) Key things from part 4 光线有效载荷是从一个着色器传递到另一个着色器的结构. 这一切都发生在RTX的引擎下. 更小的有效载荷要好得多! 新的D ...

  6. 视频系列:RTX实时射线追踪(上)

    视频系列:RTX实时射线追踪(上) Video Series: Practical Real-Time Ray Tracing With RTX RTX在游戏和应用程序中引入了一个令人兴奋的和根本性的 ...

  7. Unity3d 屏幕空间人体皮肤知觉渲染&次表面散射Screen-Space Perceptual Rendering & Subsurface Scattering of Human Skin

    之前的人皮渲染相关 前篇1:unity3d Human skin real time rendering 真实模拟人皮实时渲染 前篇2:unity3d Human skin real time ren ...

  8. 在Unity中实现屏幕空间阴影(2)

    参考文章: https://www.imgtec.com/blog/implementing-fast-ray-traced-soft-shadows-in-a-game-engine/ 完成的工程: ...

  9. Unity3D 屏幕空间雪场景Shader渲染

    笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术详解 ...

  10. 将HLSL射线追踪到Vulkan

    将HLSL射线追踪到Vulkan Bringing HLSL Ray Tracing to Vulkan Vulkan标志 DirectX光线跟踪(DXR)允许您使用光线跟踪而不是传统的光栅化方法渲染 ...

随机推荐

  1. Python和RPA网页自动化-浏览器切换不同窗口页面

    以百度为例,点击[BOSS直聘]词条会打开一个BOSS新窗口页面,分别使用Python和RPA网页自动化在不同的窗口页面来回切换窗口完成以下顺序步骤 1.Python代码如下 步骤:打开新窗口页面后, ...

  2. 【Layui】05 选项卡 Tabs

    文档位置: https://www.layui.com/doc/element/tab.html 案例演示: <div class="layui-tab"> <u ...

  3. 大连人工智能计算平台——华为昇腾AI平台——高性能计算HPC——如何在MPI中支持multiprocessing和fork操作——如何在HPC平台上使用pytorch——是否可以通过调度器的提交参数绕过HPC的计费系统

    本文要讨论的就是如何在MPI中支持multiprocessing和fork操作,但是这个问题同时也是如何在HPC平台如何使用pytorch的问题,可以说这两个问题其实是同一个问题,而这个问题的解决过程 ...

  4. mini_imagenet 数据集生成工具 (续)

    续接前文:  mini_imagenet 数据集生成工具 ============================================ 前文接受了mini_imagenet数据集的生成,但 ...

  5. 【主席树】P3919 【模板】可持久化线段树 1

    P3919 [模板]可持久化线段树 1(可持久化数组) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) #include <bits/stdc++.h> using na ...

  6. Figma 替代品 Penpot 安装和使用教程

    在设计领域,Figma 无疑是一个巨人.它彻底改变了设计流程,将协作带到了一个全新的高度.然而,随着 Adobe 收购 Figma 的消息传出,许多设计师和开发者开始担心:Figma 未来会如何演变? ...

  7. 蓝松SDK版本更新至【4.8.0】

    [Android更新] 1. android增加低精度模型,一些低端机也可以流畅抠图. 2. android针对直播机硬件做了特定API,并C语言开源. 3. 视频编辑引出帧解码图层, 允许外界异步形 ...

  8. MySQL数据库基本操作以及使用

    MySQL数据库 操纵数据库 查看数据库 show databases; 创建数据库 create database <database_name>; 删除数据库 drop databas ...

  9. esphome-esp8266

    esp8266使用esphome接入hass 对于生成配置文件的更改 此处nodemcu泛指集成的开发板,一般十几块钱一块 下方使用的是D1,对应的针脚是GPIO5 esp8266: board: n ...

  10. linux 操作系统下安装可视化界面

    一.安装背景 1.小白一只,英文不熟.还很菜,面了几个实施,打击的体无完肤!so,人丑多读书吧. 2.安装环境: VMware + centos7 3.本着不懂就问的原则 开始了--- 二.安装前准备 ...