庄懂课L11

本文介绍了Unity中ShaderLab的参数声明格式,包括数值、向量、颜色和纹理等,并详细说明了各种参数属性的作用,如[HidInInspector]、[NoScaleOffset]和[HDR]等。此外,还讲解了顶点输入和输出的数据类型以及常见的顶点Shader操作。最后,文章展示了如何在Shader中编写和组织自定义方法,提高代码复用性。
摘要由CSDN通过智能技术生成

面板

01 面板参数声明格式

数值,范围:

  • _Name("标签名" , float) = defaultVal
  • _Name("标签名" range(min , max)) = defaultVal
  • _Name("标签名" int) = defaultVal

位置,向量,颜色

  • _Name("标签名" , vector) = (xVal , yVal , zVal , wVal)
  • _Name("标签名" color) = (rVal , gVal , bVal , aVal)

2D,2D纹理,环境球:

  • _Name("标签名" , 2d) = "defaultTex"{}
  • _Name("标签名" ,3d) = "defaultTex"{}
  • _Name("标签名" ,cube) = “defaultTex”{}

02 参数属性

[HidInInspector]

  • 用途:在面板上隐藏该参数;
  • 可用于:任何参数;
  • 例:[HidInInspector]_FakeLightDir("伪光方向" , vector) = (0.0 , 1.0 , 0.0 , 1.0)

[NoScaleOffset]

  • 用途:禁用纹理的TilingOffset面板;不需要做TilingOffset的纹理,比如大部分的角色纹理,防止美术误设置;
  • 可用于:纹理参数;
  • 例:[NoScaleOffset]_MainTex("主贴图" , 2d) = "white"{}

[Normal]

  • 用途:标示该纹理参数为法线贴图,以激活相关自检功能;
  • 可用于:2D纹理参数;
  • 例:[Normal] _NormalTex("法线贴图" , 2d) = "bump"{}

[HDR]

  • 用途:用于设置高动态范围颜色值;如:灯光颜色,自发光颜色等;
  • 可用于:颜色参数;
  • 例:[HDR]_EmitCol("自发光颜色" , color) = (1.0 , 1.0 , 1.0 ,1.0)

03 参数属性

[Gamma]

  • 用途:用于颜色参数的色彩空间的转换;一般用于色彩空间为Linear的项目
  • 可用于:颜色参数
  • 例:[Gamma]_EmitCol("自发光颜色" , color) = (1.0 , 1.0 , 1.0 , 1.0)

[PowerSlider(value)]

  • 用途:对范围参数做Power处理后再传入Shader;纠正部分参数调节手感;
  • 可用于:范围参数;
  • 例:[PowerSlider(0.5)] _SpecPow("高光次幂" , range(1,90)) = 30

[Header(Label)]

  • 用途:标签,用于排版;
  • 可用于:单独使用;
  • 例:[Header(Texture)]

[Space(value)]

  • 用途:空行,用于排版;
  • 可用于:单独使用;
  • 例:[Space(5)]

其他:[Toggle] [Enum] [Keyword]配合宏使用 ,暂时不用知道;自定义Drawer需要一定的C#能力

ShaderLab中的参数类型

参数

  • fixed :11位定点数,-2.0~2.0 ,精度1/256;
  • half:16位浮点数,-60000~60000,精度约3位小数;
  • float:32位浮点数,-3.4E38~3.4E38,精度约6,7位小数;
  • Int:32位整型数,比较少使用;
  • bool:布尔型数,较少使用;

矩阵:

  • float2x2,float3x3,float4x4,float2x3诸如此类格式;
  • half2x2,half3x3,half4x4,half2x3诸如此类格式;

纹理对象:

  • sampler2D:2D纹理
  • sample3D:3D纹理
  • sampleCUBE:Cube纹理

原则上优先使用精度最低的·数据类型;

经验

  • 世界空间位置和UV坐标,使用float;
  • LDR颜色,简单乘子,可使用fixed;

但是:

不同平台对数据类型的支持情况不同;一般会自动转换,极少的胡情况自动转换会带来问题;

部分平台上,数据类型精度转换消耗也不小;所以fixed也是慎用;

IVO

01 可访问的顶点Input数据

  • POSITION 顶点位置 float3 float4
  • TEXCOORD0 UV通道1 float2  float3 float4
  • TEXCOORD1 UV通道2 float2  float3 float4
  • TEXCOORD2 UV通道3 float2  float3 float4
  • TEXCOORD3 UV通道4 float2  float3 float4
  • NORMAL 法线方向  float3
  • TANGENT 切线方向  float4
  • COLOR 顶点色  float4

02 常见的顶点Output数据

  • pos    顶点位置CS    float4
  • uv0    一般纹理UV    float4
  • uv1   LighmapUV      float2
  • posWS   顶点位置WS   float3
  • nDirWS  法线方向WS   half3
  • tDirWS   切线方向WS   half3
  • bDirWS  副切线方向WS  half3
  • color  顶点色   fixed4

03 常用的顶点Shader操作

注:Unity2019.3.2f1版本

  • pos    o.pos = UnityObjectToClipPos(v.vertex);
  • uv0    o.uv0 = v.uv0; o.uv0 = TRANSFORM_TEX(v.uv0, _MainTex);uv1    
  • o.uv1 = v.uv1; o.uv1 = v.uv1 * unity_LightmapST.xy + unity_LightmapST.zw;(这个方法也是让平铺起作用的公式)
  • posWS     o.posWS = mul(unity_ObjectToWorld, v.vertex);
  • nDirWS    o.nDirWS = UnityObjectToWorldNormal(v.normal);
  • tDirWS     o.tDirWS = normalize(mul(unity_ObjectToWorld, float4(v.tangent.xyz, 0.0)).xyz);
  • bDirWS    o.bDirWS = normalize(cross(o.nDirWS, o.tDirWS) * v.tangent.w);
  • color   o.color = v.color;(顶点色)

04 在Shader中写方法

把三色环境光写成一个方法

//原写法
float upMask = max(0.0, nDirWS.g); // 获取朝上部分遮罩
float downMask = max(0.0, -nDirWS.g); // 获取朝下部分遮罩
float sideMask = 1.0 - upMask - downMask; // 获取侧面部分遮罩
float3 envCol = _EnvUpCol * upMask + _EnvSideCol * sideMask + _EnvDownCol * downMask; // 混合环境色
//归纳为方法后的写法

// 3Col环境色方法
float3 TriColAmbient (float3 n, float3 uCol, float3 sCol, float3 dCol) {
    float uMask = max(0.0, n.g); // 获取朝上部分遮罩
    float dMask = max(0.0, -n.g); // 获取朝下部分遮罩
    float sMask = 1.0 - uMask - dMask; // 获取侧面部分遮罩
    float3 envCol = uCol * uMask +
                    sCol * sMask +
                    dCol * dMask; // 混合环境色
    return envCol; 
}
//使用三色环境光方法
float3 envCol = TriColAmbient(nDirWS, _EnvUpCol, _EnvSideCol, _EnvDownCol);

优点:代码模块化;代码复用;积累自己的方法库;

05 将3ColAmbient方法归库

如何使用以及注意事项:

最好是离Shader比较近

然后创建一个cginc文件夹  再去到这个文件夹里面新建一个txt,并把文件格式改为cginc

#include "../cginc/MyCginc.cginc"  引用这个宏   两个点..是返回到shader所在文件夹的上一级文件夹

#ifndef MYCGINC
#define MYCGINC

//这部分写库内容  头和尾是 宏 防止重复包含

// 3Col环境色方法
float3 TriColAmbient (float3 n, float3 uCol, float3 sCol, float3 dCol) {
    float uMask = max(0.0, n.g); // 获取朝上部分遮罩
    float dMask = max(0.0, -n.g); // 获取朝下部分遮罩
    float sMask = 1.0 - uMask - dMask; // 获取侧面部分遮罩
    float3 envCol = uCol * uMask +
                    sCol * sMask +
                    dCol * dMask; // 混合环境色
    return envCol; 
}

#endif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值