IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 【UnityShader】01·光照计算与法线贴图 -> 正文阅读

[游戏开发]【UnityShader】01·光照计算与法线贴图

一、光照计算

  • 不同光源数据获取 + 光源衰减计算
//宏定义判断光源类型
#if defined(DIRECTIONAL)
float3 lDir = normalize(_WorldSpaceLightPos0.xyz);
float attuention = 1.0;
#elif defined(POINT)
float3 lDir = normalize(_WorldSpaceLightPos0.xyz - i.pos_WS);
float distance = length(_WorldSpaceLightPos0.xyz - i.pos_WS);
//获取点光源范围值
float range = 1.0 / unity_WorldToLight[0][0];
//获取光源衰减值
float attuention = saturate((range - distance) / range);
#endif

  • RenderPath(渲染路径)实现多光源照明

Pass1
{
    //受光标签
    Tags{"LightMode" = "ForwardBase"}
    //告诉渲染管线这个pass以forwardbase渲染
    #pragma multi_compile_fwdbase
    //Unity光照函数库
    #include "AutoLight.cginc"
}

Pass2
{
    //受光标签
    Tags{"LightMode" = "ForwardAdd"}
    //增加混合模式
    Blend One One
    //告诉渲染管线这个pass以forwardadd渲染
    #pragma multi_compile_fwdadd
    //Unity光照函数库
    #include "AutoLight.cginc"
}

二、法线贴图

  • 切线空间,即模型顶点的位置坐标构成的坐标系

法线:即模型顶点法线;

切线:根据模型uv的u方向获得(由引擎生成);

副法线:法线叉乘切线获得;

  • 法线贴图

法线贴图在干什么?→ 将顶点法线转化为像素法线

//顶点操作 → 获取顶点法线、切线、副法线
v2f vert (appdata v)
{
    o.normal_Dir = normalize(mul(float4(v.normal,0.0), unity_ObjectToWorld).xyz);
    o.tangent_Dir = normalize(mul(unity_ObjectToWorld, v.tangent).xyz);
    //v.tangent.w:tangent的第四个分量,为了处理不同平台下的兼容性问题
    o.binormal_Dir = cross(o.normal_Dir, o.tangent_Dir) * v.tangent.w;
}

//片元操作 → 顶点法线转像素法线
fixed4 frag (v2f i) : SV_Target
{
    float4 normal_Map = tex2D(_NormalMap, i.uv);
    //对法线数据进行解码,将压缩的法线数据从[0,1]恢复成[-1,1]
    float3 normal_data = UnpackNormal(normal_Map);

    //得到逐像素法线,若想加强法线强度,则在xy方向上乘上强度值
    //写法1
    nDir = normalize(tDir * normal_data.x + bDir * normal_data.y + nDir * normal_data.z);
    //写法2 → TBN变换
    float3x3 TBN = float3x3(tDir, bDir, nDir);
    nDir = normalize(mul(normal_data.xyz, TBN));
}
  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-01-17 11:47:50  更:2022-01-17 11:49:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 18:41:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码