一、立方体贴图(CubeMap)

  • CubeMap是什么?

CubeMap是一个由六个独立的正方形纹理组成的集合,它将多个纹理组合起来映射到一个单一纹理,通常被用来作为具有反射属性物体的反射源。

  • CubeMap如何实现?→ 采样反射向量与立方体的交点

 

//Shader实现对CubeMap采样
samplerCUBE _CubeMap;
float4 _CubeMap_HDR;fixed4 frag (v2f i) : SV_Target
{half3 view_Dir = normalize(_WorldSpaceCameraPos.xyz - i.pos_WS);half3 normal_Dir = normalize(i.normal);half3 reflect_Dir = reflect(-view_Dir, normal_Dir);half4 color_CubeMap = texCUBE(_CubeMap, reflect_Dir);half3 env_color = DecodeHDR(color_CubeMap, _CubeMap_HDR);return float4(env_color, 1.0);
}
  • 如何实现CubeMap旋转? → 对反射向量进行旋转

若想要实现将CubeMap在z平面旋转,只需实现将反射向量沿y轴旋转,即反射向量在xz平面沿原点旋转。

二维旋转矩阵如下:

float3 RotateAroundY(float3 reflect_Dir, float degree)
{//角度转弧度float rad = degree * UNITY_PI / 180;float2x2 rotateY_matrix = float2x2 (cos(rad), -sin(rad),sin(rad),  cos(rad));float2 rotate_tempVector = mul(rotateY_matrix, reflect_Dir.xz);float3 rotate_reflect_Dir = float3(rotate_tempVector.x, reflect_Dir.y, rotate_tempVector.y);return rotate_reflect_Dir;
}

或直接利用三维旋转矩阵:

float3 RotateAroundY(float3 reflect_Dir, float degree)
{//角度转弧度float rad = degree * UNITY_PI / 180;float3x3 rotateY_matrix = float3x3 ( cos(rad), 0, sin(rad),0, 1,        0,-sin(rad), 0, cos(rad));float3 rotate_reflect_Dir = mul(rotateY_matrix, reflect_Dir);return rotate_reflect_Dir;
}

二、反射探针(Reflection Probe)

  • 如何在Shader中使用反射探针生成的环境贴图?
//Unity提供的内置宏
half4 env_color = UNITY_SAMPLE_TEXCUBE(unity_SpecCube0, reflect_Dir);
half3 env_hdr_color = DecodeHDR(env_color, unity_SpecCube0_HDR);

三、粗糙度(Roughness)

将纹理设置中的Convolution Type改为Specular实现间接光镜面反射,改为Diuffuse则实现间接光漫反射,利用MipMap层级来实现粗糙度的控制。

//采样粗糙度贴图
half roughness = tex2D(_RoughnessMap, i.uv);
roughness = lerp(_RoughnessMin, _RoughnessMax, roughness);
//对粗糙度的值构造缓动曲线
roughness = roughness * (1.7 - 0.7 * roughness);
//n为MipMap层数,PBR中n往往为6
half mip_Level = roughness * n;//间接光镜面反射 → 对反射向量进行采样
half4 color_CubeMap = texCUBElod(_CubeMap, float4(reflect_Dir, mip_Level));//间接光漫反射 → 对法线方向进行采样
half4 color_CubeMap = texCUBElod(_CubeMap, float4(normal_Dir, mip_Level));

四、球谐光照(Spherical Harmonic Lighting)

球谐光照是一种光照算法,这种算法的内核是定义在球面上的特殊函数,它可以对光照进行捕捉(capture)并在之后进行重新光照(relight)并且可以实时展示全局光照(global illumination)风格的区域光源(area light)与软阴影(soft shadow)。

就使用来说,球谐光照作为光照探针的技术基础,比CubeMap的Diffuse要省性能。

//球谐光照要写在ForwardBase这个Pass里
Pass
{Tags{"LightMode" = "ForwardBase"}fixed4 frag (v2f i) : SV_Target{//获取Unity内置传递的球谐光照half3 env_color = ShadeSH9(float4(normal_Dir, 1.0));}}

Frame Debug里可以看到Unity传递的球谐系数:

【Shader】基于图像的光照(Image Based Lighting,IBL)相关推荐

  1. GraphicsLab Project之基于物理的着色系统(Physical based shading) - 基于图像的光照(Image Based Lighting)(Diffuse篇)

    作者:i_dovelemon 日期:2018-01-21 来源:CSDN 主题:PBR, Equrectangular Map, Cube Map, Irradiance Map, HDR Image ...

  2. 基于图像的光照(Image-Based Lighting, IBL)概述

    现代的游戏引擎或者渲染引擎在渲染光照时为了渲染的效率往往会使用一些二维纹理贴图来储存一些计算光照以及着色的影像数据,这就是基于图像的光照(Image-Based Lighting, IBL).当然在部 ...

  3. GPU Gems1 - 19 基于图像的光照(Image-Based Lighting)

    这篇文章打破了当时立方体贴图环境(Cube-Map Environment)用法的桎梏,深入研究了更多可能的逼真光照效果.文章主要研究了基于图像的光照(Image-Based Lighting,IBL ...

  4. PBR理论基础3:基于图像的光照(上)

    一.基于图像的光照(Image based lighting, IBL) 只要了解了下面这些,就很容易理解基于图像的光照了: 直接光与间接光的区别(UnityShader9:光照基础回顾) PBR理论 ...

  5. PBR之基于图像的光照IBL (Diffuse)

    基于图像的光照(Image Based Lighting) 在开始之前,我们先来了解下什么是基于图像的光照(IBL).一个物体,不会单独的存在一个空空的环境里面,它的周围一定有其他的物体.当光源照射到 ...

  6. CSharpGL(54)用基于图像的光照(IBL)来计算PBR的Specular部分

    CSharpGL(54)用基于图像的光照(IBL)来计算PBR的Specular部分 接下来本系列将通过翻译(https://learnopengl.com)这个网站上关于PBR的内容来学习PBR(P ...

  7. PBR理论基础3.1:基于图像的光照(下)

    接上文:PBR理论基础3:基于图像的光照(上) 四.蒙特卡洛积分 蒙特卡洛积分在前篇计算漫反射项时就已经应用过了 对于定积分    ,如果无法简单求得原函数,一个尝试去求得其近似解的方法就是蒙特卡洛积 ...

  8. unity-shader-基于图像的光照IBL

    title: unity-shader-基于图像的光照IBL categories: Unity3d-Shader tags: [unity, shader, 间接光, IBL, pbr] date: ...

  9. Unity间接光 ibl(基于图像的渲染)和SH(球谐光照)

    转自:https://zhuanlan.zhihu.com/p/68025039 间接光 间接光的实现与ibl(基于图像的渲染)和SH(球谐光照)这两个名词分不开.基于图像的渲染已经是很大的一个体系了 ...

最新文章

  1. 网站外链发布的细节注意事项!
  2. 实现账号在一端登入_跟我学spring security 基于数据库实现一个基本的登入登出...
  3. bug__android studio 出现布局文件不提示,且点击代码不能跟踪代码
  4. dao.php,DAO.php · Dodd/Training Lab - Gitee.com
  5. 20141124-1
  6. 虚拟工具]虚拟机VMware6.0深度精简汉化版+VMware Tools
  7. 找电影最强攻略,最全资源站
  8. 我java启蒙老师 郝斌老师
  9. 原生JS实现在线音乐播放器及歌词滚动
  10. jQuery-3.4.1下载
  11. 使用苹果手机/PAD做树莓派的外接屏幕
  12. UnityShader入门精要-屏幕后处理效果 亮度饱和度对比度、边缘检测、高斯模糊、bloom效果、运动模糊
  13. 小米电视怎么下载软件?用一起看TV宅家不无聊
  14. Qemu-guest-agent(QGA)原理介绍及接口扩展
  15. PHP:Maze迷宫寻址算法(附完整源码)
  16. nb移动udp_NB-IOT联网及模块UDP数据传输过程
  17. Linux 离线安装.net sdk
  18. 网站前端进行违禁词过滤js代码
  19. Win11 预览体验计划空白无显示的一种解决方案
  20. 三菱电梯c语言程序代码破解,三菱电梯LEHY-C故障代码大全

热门文章

  1. 水印去除(基于nosie2noise优化 代码+模型)
  2. 《程序员脱发指南》--饮食篇
  3. 计算净现值和内部报酬率的方法
  4. 最详细PicGo(图床)加阿里云OSS实现图片自动上传
  5. 磁盘阵列技术RAID
  6. 欧派家居的财务费用也出现了较快速度的增长
  7. 筷子兄弟的病毒营销,只用了一首歌!
  8. 2022年康复医学治疗技术(师)考试题库
  9. 智能化里面计算机网络设计思路,智能化设计思路.doc
  10. 【PhotoShop】利用PS制作唯美咖啡泡