当前位置: 首页 > news >正文

Unity中URP下的SimpleLit片元着色器

文章目录

  • 前言
  • 一、SimpleLit片元着色器大体框架
    • 1、传入 和 返回
    • 2、GPU实例化部分
    • 3、准备 BlinnPhong 光照模型计算需要的 SurfaceData
    • 4、准备 BlinnPhong 光照模型计算需要的 InputData
    • 5、进行 BlinnPhong 的计算、雾效颜色混合及透明度计算
  • 二、准备SurfaceData
    • 1、SurfaceData结构体包含什么:
    • 2、初始化SurfaceData:
    • 3、漫反射颜色及透明度计算
    • 4、混合漫反射颜色 与 透明度
    • 5、玻璃效果纹理采样、金属度、镜面反射颜色 及 光滑度
    • 6、自发光纹理采样
    • 在这里插入图片描述
  • 三、准备InputData
    • 1、InputData结构体包含什么
    • 2、初始化InputData
    • 1、法线贴图相关
    • 2、视线向量计算 及计算前的向量归一化
    • 3、阴影因子计算
    • 4、额外灯相关计算
    • 5、全局光照相关计算
    • 6、光照贴图相关计算


前言

在上篇文章中,我们了解了Unity中URP下SimpleLit中的顶点着色器。

  • Unity中URP下的SimpleLit顶点着色器

我们在这篇文章中,来了解一下Unity中URP下SimpleLit中的片元着色器。有助于我们之后写自己的光照Shader。

在这里插入图片描述


一、SimpleLit片元着色器大体框架

1、传入 和 返回

  • 这里传入参数为 顶点着色器输出的Varyings结构体
  • 返回结果用 out修饰来代替函数前的返回类型
    在这里插入图片描述

2、GPU实例化部分

在这里插入图片描述

3、准备 BlinnPhong 光照模型计算需要的 SurfaceData

在这里插入图片描述

4、准备 BlinnPhong 光照模型计算需要的 InputData

在这里插入图片描述

5、进行 BlinnPhong 的计算、雾效颜色混合及透明度计算

在这里插入图片描述

由此可以看出:SimpleLit 的片元着色器中
我们最重要的部分是:

  1. 准备SurfaceData
  2. 准备InputData
  3. 最后 BlinnPhong 的计算

二、准备SurfaceData

1、SurfaceData结构体包含什么:

在这里插入图片描述

  1. albedo:漫反射颜色
  2. specular:镜面反射颜色
  3. metallic:金属度
  4. smoothness:平滑度
  5. normalTS:法线
  6. emission:自发光颜色

2、初始化SurfaceData:

在这里插入图片描述

3、漫反射颜色及透明度计算

  • 透明度计算时,会把漫反射透明度 和 主颜色透明度进行相乘混合
    在这里插入图片描述
  • AlphaDiscard:对透明度做处理
    在这里插入图片描述

4、混合漫反射颜色 与 透明度

  • 用我们的漫反射颜色 与 主要颜色混合
  • 用我们的透明度 与 输出颜色混合
    在这里插入图片描述

5、玻璃效果纹理采样、金属度、镜面反射颜色 及 光滑度

在这里插入图片描述

6、自发光纹理采样

在这里插入图片描述

三、准备InputData

1、InputData结构体包含什么

在这里插入图片描述

  • positionWS、positionCS:顶点在世界空间 和 齐次裁剪空间下的数据
  • normalWS:世界空间下的法线数据
  • viewDirectionWS:视线向量
  • shadowCoord:阴影相关
  • fogCoord:雾效混合因子
  • vertexLighting:顶点光照颜色
  • bakedGI:全局光照烘焙颜色
  • shadowMask:阴影遮罩
  • tangentToWorld:切线转化到世界空间的转化矩阵

2、初始化InputData

void InitializeInputData(Varyings input, half3 normalTS, out InputData inputData){inputData = (InputData)0;inputData.positionWS = input.positionWS;#ifdef _NORMALMAPhalf3 viewDirWS = half3(input.normalWS.w, input.tangentWS.w, input.bitangentWS.w);inputData.tangentToWorld = half3x3(input.tangentWS.xyz, input.bitangentWS.xyz, input.normalWS.xyz);inputData.normalWS = TransformTangentToWorld(normalTS, inputData.tangentToWorld);#elsehalf3 viewDirWS = GetWorldSpaceNormalizeViewDir(inputData.positionWS);inputData.normalWS = input.normalWS;#endifinputData.normalWS = NormalizeNormalPerPixel(inputData.normalWS);viewDirWS = SafeNormalize(viewDirWS);inputData.viewDirectionWS = viewDirWS;#if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR)inputData.shadowCoord = input.shadowCoord;#elif defined(MAIN_LIGHT_CALCULATE_SHADOWS)inputData.shadowCoord = TransformWorldToShadowCoord(inputData.positionWS);#elseinputData.shadowCoord = float4(0, 0, 0, 0);#endif#ifdef _ADDITIONAL_LIGHTS_VERTEXinputData.fogCoord = InitializeInputDataFog(float4(inputData.positionWS, 1.0), input.fogFactorAndVertexLight.x);inputData.vertexLighting = input.fogFactorAndVertexLight.yzw;#elseinputData.fogCoord = InitializeInputDataFog(float4(inputData.positionWS, 1.0), input.fogFactor);inputData.vertexLighting = half3(0, 0, 0);#endif#if defined(DYNAMICLIGHTMAP_ON)inputData.bakedGI = SAMPLE_GI(input.staticLightmapUV, input.dynamicLightmapUV, input.vertexSH, inputData.normalWS);#elseinputData.bakedGI = SAMPLE_GI(input.staticLightmapUV, input.vertexSH, inputData.normalWS);#endifinputData.normalizedScreenSpaceUV = GetNormalizedScreenSpaceUV(input.positionCS);inputData.shadowMask = SAMPLE_SHADOWMASK(input.staticLightmapUV);#if defined(DEBUG_DISPLAY)#if defined(DYNAMICLIGHTMAP_ON)inputData.dynamicLightmapUV = input.dynamicLightmapUV.xy;#endif#if defined(LIGHTMAP_ON)inputData.staticLightmapUV = input.staticLightmapUV;#elseinputData.vertexSH = input.vertexSH;#endif#endif}

1、法线贴图相关

在这里插入图片描述

2、视线向量计算 及计算前的向量归一化

在这里插入图片描述

3、阴影因子计算

在这里插入图片描述

4、额外灯相关计算

在这里插入图片描述

5、全局光照相关计算

在这里插入图片描述

6、光照贴图相关计算

在这里插入图片描述

相关文章:

  • HPsocket 在 C# 中的运用:一款优秀的 socket 通信框架
  • Linux系统下安装Vcpkg,并使用Vcpkg安装、编译OpenSceneGraph
  • 每日温度00
  • SD-WAN组网设计原则:灵活、安全、高效
  • ❤ Uniapp使用二 ( 日常使用篇)
  • 超级弱口令检查工具
  • [C#]C# winform部署yolov8目标检测的openvino模型
  • 【软件测试学习笔记7】Linux指令实操练习
  • 自动驾驶模拟器
  • 解决kali beef启动失败解问题
  • 高清网络视频监控系统技术方案
  • 【Bug】.net6 cap总线+rabbitmq延时消息收不到
  • (初研) Sentence-embedding fine-tune notebook
  • Git学习笔记(第6章):GitHub操作(远程库操作)
  • Transformer详解(附代码实现及翻译任务实现)
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 2017-09-12 前端日报
  • ECS应用管理最佳实践
  • JavaScript设计模式系列一:工厂模式
  • Kibana配置logstash,报表一体化
  • Laravel5.4 Queues队列学习
  • leetcode98. Validate Binary Search Tree
  • Meteor的表单提交:Form
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • 从伪并行的 Python 多线程说起
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 使用parted解决大于2T的磁盘分区
  • 数据可视化之 Sankey 桑基图的实现
  • 一个完整Java Web项目背后的密码
  • 用quicker-worker.js轻松跑一个大数据遍历
  • 在Unity中实现一个简单的消息管理器
  • 怎么将电脑中的声音录制成WAV格式
  • #Ubuntu(修改root信息)
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • (007)XHTML文档之标题——h1~h6
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (算法)Travel Information Center
  • (五)网络优化与超参数选择--九五小庞
  • (原創) 物件導向與老子思想 (OO)
  • [【JSON2WEB】 13 基于REST2SQL 和 Amis 的 SQL 查询分析器
  • [④ADRV902x]: Digital Filter Configuration(发射端)
  • [C#]winform部署yolov5-onnx模型
  • [C/C++随笔] char与unsigned char区别
  • [Editor]Unity Editor类常用方法
  • [Flutter]打包IPA
  • [FT]chatglm2微调
  • [IM] [Webhook] Webhook实现IM平台机器人
  • [Java][Android][Process] ProcessBuilder与Runtime差别
  • [LeetCode刷题笔记]1 - 两数之和(哈希表)
  • [Linux] LVS+Keepalived高可用集群部署
  • [Linux_IMX6ULL应用开发]-Makefile
  • [Oh My C++ Diary]\t \n \r的用法