Chapter17 表面着色器——Shader入门精要学习
创始人
2024-12-17 08:35:10
0

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 (SurfaceOutput s, half3 lightDir, half atten); half4 Lighting (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=metal 	half Smoothness; //0=rough,1=smooth 	half Occlusion; 	fixed Alpha; }; struct SurfaceOutputStandardSpecular{ 	fixed3 Albedo; 	fixed3 Specular; 	fixed3 Normal; //tangent space normal  	half3 Emission; 	half Smoothness; //0=rough,1=smooth 	half 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

四、表面着色器的缺点

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

相关内容

热门资讯

终于发现!微信群炸金花房卡怎么... 微信游戏中心:炸金花房卡,添加微信【71319951】,进入游戏中心或相关小程序,搜索“微信炸金花房...
在哪里能买金花房卡/微信斗牛房... 微信斗牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:86909166许多玩家在游戏中会购买房卡来...
终于发现!微信群链接炸金花房卡... 微信游戏中心:炸金花房卡,添加微信【56001354】,进入游戏中心或相关小程序,搜索“微信炸金花房...
买房卡的金花房代理联系方式/微... 斗牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:44346008许多玩家在游戏中会购买房卡来享受...
ia攻略/金花房卡批发价盘古大... 今 日消息,盘古大厅房卡添加微信33549083 苹果今日发布了 iOS 16.1 正式版更新,简单...
重大通报,牛牛充值房卡人人大厅... 重大通报,牛牛充值房卡人人大厅/科技房卡多少钱一张人人大厅是一款非常受欢迎的游戏,咨询房/卡添加微信...
终于发现!炸金花房卡如何充值,... 微信游戏中心:炸金花房卡,添加微信【66336574】,进入游戏中心或相关小程序,搜索“微信炸金花房...
微信斗牛房卡链接使用方法/微信... 微信炸金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:86909166许多玩家在游戏中会购买房卡...
头条推荐!金花房间怎么创建新众... 微信游戏中心:新众亿/皇豪互娱房卡在哪里买打开微信,添加客服微信【88355042】,进入游戏中心或...
科技实测!金花房卡出售钻石大厅... 科技实测!金花房卡出售钻石大厅/房卡购买房间怎么开Sa9Ix苹果iPhone 17手机即将进入量产阶...
头条推荐!金花房卡是正规的金牛... 您好!微信金牛座厅/新西部大厅链接获取房卡可以通过以下几种方式购买: 1.微信渠道:(金牛座厅/新...
终于发现!微信炸金花房卡找谁买... 微信游戏中心:炸金花房卡,添加微信【71319951】,进入游戏中心或相关小程序,搜索“微信炸金花房...
IA解析/游戏推荐牛牛房卡出售... 今 日消息,白虎大厅房卡添加微信33549083 苹果今日发布了 iOS 16.1 正式版更新,简单...
微信房卡斗牛金花有透视吗/微信... 微信炸金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:15984933许多玩家在游戏中会购买房卡...
终于发现!微信牛牛房卡多少钱一... 微信游戏中心:牛牛房卡,添加微信【56001354】,进入游戏中心或相关小程序,搜索“微信牛牛房卡”...
正规平台有哪些,怎么买斗牛房卡... 微信游戏中心:新八戒房卡在哪里买打开微信,添加客服微信【88355042】,进入游戏中心或相关小程序...
秒懂教程“牛牛链接房卡在哪里弄... 牛牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:44346008许多玩家在游戏中会购买房卡来享受...
推荐一款!怎么买斗牛房卡皇豪互... 皇豪互众/新道游是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:【3329006910】或QQ:33...
正版授权!微信金花房卡怎么弄乐... 正版授权!微信金花房卡怎么弄乐乐大厅/微信链接房卡充值链接Sa9Ix苹果iPhone 17手机即将进...
一分钟了解!金花房卡如何购买高... 您好!微信高朋联盟大厅链接获取房卡可以通过以下几种方式购买: 1.微信渠道:(高朋联盟)大厅介绍:...