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

Chapter17 表面着色器——Shader入门精要学习

Chapter17 表面着色器

  • 一、编译指令
    • 1.表面函数
    • 2.光照函数
    • 3.其他可选参数
  • 二、两个结构体
    • 1.Input 结构体:数据来源
    • 2.SurfaceOutput
  • 三、Unity背后做了什么
  • 四、表面着色器的缺点

一、编译指令

  • 作用:指明该表面着色器的 表面函数光照函数,并设置一些可选参数

#pragma surface surfaceFunction lightMode [optionalparams]:#pragma surface 用于指明该编译指令是用于定义表面着色器的,后面需要指明表面函数(surfaceFunction)和光照模型( lightMode),以及一些可选的参数

1.表面函数

surfaceFunction 用于定义对象的表面属性(反射率、光滑度、透明度等),通常是名为 surf 的函数(名字可以任意),格式是固定的

void surf(Input IN, inout SurfaceOutput o)
void surf(Input IN, inout SurfaceOutputStandard o)
void surf(Input IN, inout SurfaceOutputStandardSpecular o)
  • 输入结构体 InputIN 来设置表面属性,并存储在结构体 SurfaceOutput、SurfaceOutputStandard、SurfaceOutputStandardSpecular 中(都是Unity内置结构体),再传递给光照函数计算光照结果

2.光照函数

使用表面函数中设置的各种表面属性,来应用某些光照模型。Unity内置了基于物理的光照模型函数 Standard 和 StandardSpecular( UnityPBSLighting.cginc),以及简单的非基于物理的光照模型函数 Lambert 和 Blinn-Phong(Lighting.cginc)

  • 定义自己的光照函数
half4 Lighting<NAME> (SurfaceOutput s, half3 lightDir, half atten);
half4 Lighting<NAME> (SurfaceOutput s, half3 lightDir, half3 viewDir, half atten);

3.其他可选参数

  • 自定义的修改函数顶点修改函数(vertex:VertexFunction)最后颜色修改函数(finalColor:ColorFunction)
    • 顶点修改函数:自定义顶点属性(顶点颜色传递给表面函数、修改顶点位置、实现顶点动画等)
    • 最后颜色修改函数:在颜色绘制到屏幕前,最后一次修改颜色值(实现自定义雾效等)
  • 阴影
    • addshadow:会为表面着色器生成一个阴影投射的Pass
    • fullforwardshadow:可以在前向渲染中支持所有光源类型的阴影
    • noshadow:禁用阴影
  • 透明度测试和透明度混合alphatestalpha
  • 光照:控制光照对物体的影响
    • noambient:不应用任何环境光照或光照探针
    • novertexlights不应用任何逐顶点光照
    • noforwardadd:去掉前向渲染中的额外Pass,只支持一个逐像素的平行光,其他光源会逐顶点或SH方法来计算
    • nolightmap、nofog等
  • 控制代码生成:可以控制只使用前向或者延迟(Unity会为表面着色器生成前向渲染路径和延迟渲染路径用的Pass)exclude_path:deferred、exclude_path:forward和exclude_path:prepass

二、两个结构体

1.Input 结构体:数据来源

在这里插入图片描述
还支持自定义变量,采样坐标必须以uv为前缀,比如 uv_MainTex

2.SurfaceOutput

SurfaceOutput、SurfaceOutputStandard、SurfaceOutputStandardSpecular 会作为表面函数的输出,光照函数的输入来进行光照计算

  • SurfaceSurfaceOutput
struct SurfaceOutput{fixed3 Albedo;fixed3 Normal;fixed3 Emission;half Specular;fixed Gloss;fixed Alpha;
};
  • SurfaceOutputStandard、SurfaceOutputStandardSpecular:用于基于物理的光照模型
struct SurfaceOutputStandard{fixed3 Albedo;fixed3 Normal; //tangent space normal half3 Emission;half Metallic; //0=non-metal,1=metalhalf Smoothness; //0=rough,1=smoothhalf Occlusion;fixed Alpha;
};
struct SurfaceOutputStandardSpecular{fixed3 Albedo;fixed3 Specular;fixed3 Normal; //tangent space normal half3 Emission;half Smoothness; //0=rough,1=smoothhalf Occlusion;fixed Alpha;
};

三、Unity背后做了什么

Unity背后会为表面着色器生成真正的一个包含多个Pass(针对不同渲染路径的)的顶点/片元着色器。会为前向渲染路径生成LightMode为ForwardBase和ForwardAdd的Pass;为延迟渲染路径生成LightMode为Deferred的Pass;为了给光照映射和动态全局光照提取表面信息,Unity会生成LightMode为Meta的Pass

  • Unity对ForwardBase的Pass的自动生成过程如下:
    在这里插入图片描述
  • 1.Unity会分析代码,据此生成顶点着色器的输出——v2f_surf结构体。Unity会分析我们在自定义函数中使用的变量,如果需要,就会在v2f_surf中生成相应的变量。有时在Input中定义了某些变量,但后面并没有使用时,v2f_surf不会生成
  • 2.生成顶点着色器
  • 3.生成片元着色器:使用v2f_surf来填充Input

四、表面着色器的缺点

  • 在表面着色器上完成的,都可以在顶点/片元着色器中重现,但反之不成立
  • 性能较差:失去了对各种优化和各种特效实现的控制
  • 无法完成自定义的渲染效果:玻璃等

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • keystone学习小结2
  • 深入理解Linux网络(四):TCP接收阻塞
  • 前端 Tips
  • pip安装出现的问题之SSL,一大堆WARNING问题
  • OD C卷 - 数据单元的变量替换
  • 初级java每日一道面试题-2024年7月23日-Iterator和ListIterator有什么区别?
  • C++五子棋(未做完,但能玩,而且还不错)
  • Hi3751V560_SELinux
  • Error和Exception区别
  • Jenkins卡在等待界面解决方法
  • python——pynput
  • java面试-场景题
  • 嵌入式C/C++、FreeRTOS、STM32F407VGT6和TCP:智能家居安防系统的全流程介绍(代码示例)
  • Pycharm 和虚拟环境的那些事?
  • 【SASS/SCSS(三)】样式的复用与动态计算(@mixin和@function)
  • [ JavaScript ] 数据结构与算法 —— 链表
  • [case10]使用RSQL实现端到端的动态查询
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • express.js的介绍及使用
  • Java 23种设计模式 之单例模式 7种实现方式
  • leetcode98. Validate Binary Search Tree
  • Logstash 参考指南(目录)
  • mac修复ab及siege安装
  • MySQL几个简单SQL的优化
  • SQLServer之创建数据库快照
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • 当SetTimeout遇到了字符串
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 无服务器化是企业 IT 架构的未来吗?
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​Spring Boot 分片上传文件
  • ‌U盘闪一下就没了?‌如何有效恢复数据
  • # Panda3d 碰撞检测系统介绍
  • #APPINVENTOR学习记录
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • #职场发展#其他
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (4)事件处理——(7)简单事件(Simple events)
  • (6)STL算法之转换
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (poj1.2.1)1970(筛选法模拟)
  • (笔试题)分解质因式
  • (二)换源+apt-get基础配置+搜狗拼音
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (十)c52学习之旅-定时器实验
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转)【Hibernate总结系列】使用举例
  • (转)ObjectiveC 深浅拷贝学习
  • *Django中的Ajax 纯js的书写样式1
  • .net web项目 调用webService