本轮作业中,我们需要在一个光源为方向光,材质为漫反射 (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 在PDF中添加、替换、或删除图片

    PDF文件中的图片可以丰富文档内容,提升用户的阅读体验.除了在PDF中添加图片外,有时也需要替换或删除其中的图片,以改进视觉效果或更新信息.本文将提供以下三个示例,介绍如何使用Python 操作PDF ...

  2. Jax框架的显存分析已经不支持gperftools,而是支持go语言下的新版本pprof

    官方: https://jax.readthedocs.io/en/latest/device_memory_profiling.html

  3. 【转载】 深入理解TensorFlow中的tf.metrics算子

    原文地址: https://mp.weixin.qq.com/s/8I5Nvw4t2jT1NR9vIYT5XA ============================================ ...

  4. 【转载】 vscode如何在最新版本中配置c/c++语言环境中的launch.json和tasks.json?

    作者:来知晓链接:https://www.zhihu.com/question/336266287/answer/2144611720来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载 ...

  5. maven配置阿里云镜像与修改默认仓库地址

    1.背景 通常来说maven的默认镜像很慢,我们需要一个国内镜像,拉取jar包的时候从国内下载, 当然阿里云镜像是很好的一个候选 2.安装 官网下载一个maven解压即可使用 3.修改配置 第一步,找 ...

  6. 随时随地与 LLMs 聊天的开源项目「GitHub 热点速览」

    众所周知,本地运行 LLMs 需要下载模型(体积大),并且还比较吃硬件配置.近日 GitHub 推出了 GitHub Models 服务,让开发者可以在 GitHub 上免费测试 Llama.Phi ...

  7. 如何快速在 Apache DolphinScheduler 新扩展一个任务插件?

    作者 | 代立冬 编辑 | Debra Chen Apache DolphinScheduler 是现代数据工作流编排平台,具有非常强大的可视化能力,DolphinScheduler 致力于使数据工程 ...

  8. 7E头的那些事儿(帧格式分析实例)

    0. 前言 作为一名嵌入式工程师,经常需要通过UART与外设打交道,而对于串行总线来说,往往我们必须要进行帧同步.通常的做法是把信令包含在2个0x7E的中间. 除此之外还有HDLC.PPP等协议也会到 ...

  9. Minnaert

    Minnaert 假设气泡关闭时发生周期性膨胀和收缩,周围水也跟着振动,就嗷地一声叫了出来!设有个半径为 \(r\) 的泡形成后开始简谐振动,半径有 \[r=r_0+a\sin\frac{2\pi t ...

  10. Oracle数据库安装与还原

    安装Oracle 11g数据库 安装数据库参考这位大佬的文章:(135条消息) Oracle 11g版本下载及安装超详细教程图解_oracle11g下载_田夜的博客-CSDN博客 非常详细 利用dmp ...