首页 > 其他分享 >ssr屏幕空间射线追踪

ssr屏幕空间射线追踪

时间:2024-01-22 21:34:03浏览次数:24  
标签:uv normal 0.0 float wi ssr vec3 屏幕 追踪

本轮作业中,我们需要在一个光源为方向光,材质为漫反射 (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 如果加上时域和空域的光追降噪算法,效果会更佳

标签:uv,normal,0.0,float,wi,ssr,vec3,屏幕,追踪
From: https://www.cnblogs.com/bluebean/p/17981129

相关文章

  • js 栈追踪与内存管理
    期约与异步函数的功能有相当程度的重叠,但它们在内存中的表示则差别很大。看看下面的例子,它展示了拒绝期约的栈追踪信息:functionfooPromiseExecutor(resolve,reject){setTimeout(reject,1000,'bar');}functionfoo(){newPromise(fooPromiseExecutor);}fo......
  • 全面解析华企盾DSC屏幕浮水印功能
    在当今信息化时代,企业的核心数据信息面临着巨大的安全挑战。近年来,数据泄露事件频发,严重损害了企业的经济利益和商业信誉。为了有效防范数据泄露风险,许多企业选择部署数据安全防护系统。其中,华企盾DSC数据防泄密系统凭借其多方面的数据安全防护功能,在业内备受青睐。客户痛点:某公......
  • [NSSRound#16 Basic]RCE但是没有完全RCE
    题目代码:<?phperror_reporting(0);highlight_file(__file__);include('level2.php');if(isset($_GET['md5_1'])&&isset($_GET['md5_2'])){if((string)$_GET['md5_1']!==(string)$_GET['md5_2']......
  • Blazor SSR/WASM IDS/OIDC 单点登录授权实例讲解1
    目录:OpenID与OAuth2基础知识BlazorwasmGoogle登录BlazorwasmGitee码云登录BlazorSSR/WASMIDS/OIDC单点登录授权实例讲解1BlazorSSR/WASMIDS/OIDC单点登录授权实例讲解2BlazorSSR/WASMIDS/OIDC单点登录授权实例讲解3源码BlazorOIDC/Server1.建立Bl......
  • 解决屏幕缩放大小让元素不变动
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>testdiv</title></head><style>body,html{padding:0;margin:0;}#ap......
  • js自动缩放页面自适应屏幕分辨率
    1.简单版:s=window.screen.width/1920;document.body.style.zoom=s;2. 当开发前端页面在分辨率1920的情况下,需要切换到小屏,有种方法是可以对屏幕比例进行缩放,通过css3属性transform可以自适应屏幕分辨率大小vars;functionresize(){s=window.screen.width......
  • stm32笔记[11]-驱动SSD1306屏幕
    摘要在蓝桥杯物联网的CT127C开发板上驱动SSD1306的0.91寸显示屏.平台信息KeilMDK-ARM(μVision)V5.35.0.0STM32CubeMX6.2.1原理简介CT127C开发板简介蓝桥物联网竞赛实训装置省赛训练套装,适用于蓝桥杯大赛(电子类)物联网设计与开发科目竞赛训练及高校日常教学实训环......
  • 解决 DELPHI 中执行外部命令出现屏幕一闪的问题的方法
    解决DELPHI中执行外部命令出现屏幕一闪的问题的方法有的时候我们在DELPHI中使用ShellExecuteEx(exInfo:TShellExecuteInfo)函数执行一些外部命令,但会出现,屏幕一闪的问题,解决方法如下:设置exinfo.nShow:=SW_HIDE;//隐藏命令执行的窗口,不会出现屏幕一闪的情况在exinfo......
  • 基于智能手机的行人惯性追踪数据集模型与部署
    论文总结这篇《Smartphone-basedPedestrianInertialTracking:Dataset,Model,andDeployment》论文介绍了一种基于智能手机惯性测量单元(IMU)的行人追踪和定位系统。主要内容和贡献如下:数据集和实验设计:作者开发了一个智能手机惯性测量数据集(SIMD),包含超过4500条步行轨迹,涵盖了......
  • 技术写作概述:内容分析、平台和转化追踪以及内容老化
    内容分析内容分析是一种技术作家用来解释和量化文本数据的研究方法。它涉及从不同来源的文本中编码和识别主题或模式的系统过程,这些来源包括书籍、博客、文章或其他文档类型。其主要目标是提供主观解释的、但有效且可重复的、从数据中得出的推论。这种技术有助于确定所讨论的内容......