Unity -shader详解

1 ShaderLab属性类型和Cg变量类型的匹配关系

Color、Vector:float4,half4,fixed4

Range、Float:float, half, fixed

2D:sampler2D

3D:sampler3D

Cube:samplerCube

Int:int(32位整型数据)

[code]csharpcode:

Shader "Unlit/Test Shader"
{
    Properties
    {
        _Color ("Color Tint", Color) = (1, 1, 1, 1)
        _MainTex ("Main Tex", 2D) = "white" {}
        _BumpMap ("Normal Map", 2D) = "bump" {}
        _BumpScale ("Bump Scale", Float) = 1.0
        _SpecularMask ("Specular Mask", 2D) = "white" {}
        _SpecularScale ("Specular Scale", Float) = 1.0
        _Specular ("Specular", Color) = (1, 1, 1, 1)
        _Gloss ("Gloss", Range (8.0, 256.0)) = 20.0
    }
    SubShader{15         Pass{16             ......17         }
}

2 Cg/HLSL常用的3种精度的数值类型

float: 32位存储,用在坐标、未归一化的矢量、uv、一些调整参数

half:16位存储,范围 -60000~60000

fixed:11位存储,范围-2.0~2.0,用于存储颜色、归一化后的矢量、在这个范围内的参数等

注意:uv不能用fixed存储,因为可能通过贴图的Tiling和Offset让其范围超过[0, 1]

[code]csharpcode:

fixed4 _Color;
            sampler2D _MainTex;
            float4 _MainTex_ST;
            sampler2D _BumpMap;
            float _BumpScale;
            sampler2D _SpecularMask;
            float _SpecularScale;
            fixed4 _Specular;
            float _Gloss;

            struct a2v
            {
                float4 vertex : POSITION;
                float3 normal : NORMAL;
                float4 tangent : TANGENT;
                float4 texcoord : TEXCOORD0;
            };

            struct v2f
            {
                float4 pos : SV_POSITION;
                float2 uv : TEXCOORD0;
                float3 lightDir : TEXCOORD1;
                float3 viewDir : TEXCOORD2;
            };

            v2f vert (a2v v)
            {
                v2f o;
                ......
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                ......       
                return fixed4(ambient + diffuse + specular, 1.0);
            }

3 Unity Shader常用语义(寄存器)

 

3.1 从应用阶段传递模型数据给顶点着色器时:

POSITION:模型空间中的顶点位置,通常是float4类型

NORMAL:顶点法线,通常是float3类型

TANGENT:顶点切线,通常是float4类型,第四个分量用于存储特殊数值

TEXCOORDn:顶点纹理坐标,通常是float2或float4类型。在Unity Model2和3中,n=8(Unity默认),在4和5中n=16.

COLOR:顶点颜色,通常是fixed4或float4类型

3.2 从顶点着色器传递给片元着色器时:

SV_POSITION:裁剪空间中的顶点坐标,结构体中必须包含一个用该语义的变量

COLOR0:输出第一组顶点颜色,不必需

COLOR1:输出第二组顶点颜色,不必需

TEXCOORD0~7:输出纹理坐标,不必需

3.3 片元着色器输出:

SV_Target: 输出值将会存储到渲染目标(render target)中

注意:一个语义可以使用的寄存器最多只能处理4个浮点值(float),因此对于4x4矩阵,需要拆分成4个float4类型的变量来存储矩阵数据

4 Unity Shader常用函数

[code]csharpcode:

float3 WorldSpaceViewDir(float4 v) //输入一个模型空间中的顶点位置,返回世界空间中从该点到摄像机的观察方向

float3 ObjSpaceViewDir(float4 v) //输入一个模型空间中的顶点位置,返回模型空间中从该点到摄像机的观察方向

float3 WorldSpaceLightDir(float4 v) //仅用于前向渲染中(ForwardBase),输入一个模型空间中的顶点位置,返回世界空间中从该点到光源的光照方向,没有被归一化

float3 UnityWorldSpaceLightDir(float4 v) //仅可用于前向渲染中,输入一个世界空间的顶点位置,返回世界空间从该点到光源的光照方向,没有被归一化

float3 ObjSpaceLightDir(float4 v) //仅用于前向渲染中(ForwardBase),输入一个模型空间中的顶点位置,返回模型空间中从该点到光源的光照方向,没有被归一化

float3 UnityObjectToWorldNormal(float3 norm) //把法线从模型空间转换到世界空间中

float3 UnityObjectToWorldDir(in float3 dir) //把方向矢量从模型空间转换到世界空间中

float3 UnityWorldToObjectDir(float3 dir) //把方向矢量从世界空间转换到模型空间中

float3 Shade4PointLights(...) //仅可用于前向渲染中,计算四个点光源的光照,它的参数是已经打包进矢量的光照数据。前向渲染通常会使用这个函数来计算逐顶点光照

5 Unity Shader 变量

[code]csharpcode:

UNITY_MATRIX_MVP    //当前的模型*观察*投影矩阵,用于将顶点/方向矢量从模型空间转换到裁剪空间

UNITY_MATRIX_MV //当前的模型*观察矩阵,用于将顶点/方向矢量从模型空间转换到观察空间

UNITY_MATRIX_V  //当前的观察矩阵,用于将顶点/方向矢量从世界空间转换到观察空间

UNITY_MATRIX_P  //当前的投影矩阵,用于将顶点/方向矢量从观察空间转换到裁剪空间

UNITY_MATRIX_VP //当前的观察*投影矩阵,用于将顶点/方向矢量从世界空间转换到裁剪空间

UNITY_MATRIX_T_MV   //UNITY_MATRIX_MV的转置矩阵

UNITY_MATRIX_IT_MV  //UNITY_MATRIX_MV的逆转置矩阵,用于将发现从模型空间转换到观察空间,也可以用于得到UNITY_MATRIX_MV的逆矩阵

unity_ObjectToWorld(_Object2World)  //当前的模型矩阵,用于将顶点/方向矢量从模型空间变换到世界空间

unity_WorldToObject(_World2Object)  //用于将顶点/方向矢量从世界空间转换到模型空间

6 Unity Shader 摄像机和屏幕参数

[code]csharpcode:

//该摄像机在世界空间中的位置
float3  _WorldSpaceCameraPos 

//x=1.0(或-1.0,如果正在使用一个翻转的投影矩阵进行渲染),y=Near,z=Far,w=1.0+1.0/Far,其中Near和Far分别是近裁剪平面和远裁剪平面到摄像机的距离
float4  _ProjectionParams    

//x=width,y=height,z=1.0+1.0/width,w=1.0+1.0/height,其中width和height分别是该摄像机的渲染目标(render target)的像素宽度和高度
float4  _ScreenParams   

 //x=1-Far/Near,y=Far/Near,z=x/Far,w=y/Far,该变量用于线性化Z缓存中的深度值
float4  _ZBufferParams 

//x=width,y=height,z没有定义,w=1.0(该摄像机是正交摄像机)或w=0.0(该摄像机是透视摄像机),其中width和height是正交投影摄像机的宽度和高度
float4  unity_OrthoParams   

//该摄像机的投影矩阵
float4x4  unity_CameraProjection    

//该摄像机的投影矩阵的逆矩阵
float4x4  unity_CameraInvProjection 

//该摄像机的6个裁剪平面在世界空间下的等式,按左、右、下、上、近、远裁剪平面
float4  unity_CameraWorldClipPlanes[6]   
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

EvanXZ

各位大佬 多多支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值