ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

读UnityShader入门精要第三章-Unity Shader基础

2022-07-31 00:00:55  阅读:205  来源: 互联网

标签:MainTex vertex Shader Unity UnityShader Pass 属性


1.Unity Shader概述

1.1  材质和Unity Shader

  在Unity中材质(Meterial)和Unity Shader需要配合使用,一个常见的流程是:

  1)创建一个材质;

  2)创建一个Unity Shader,并把它赋给上一步中创建的材质;

  3)把材质赋给要渲染的对象;

  4)在材质面板中调整Unity Shader的属性,以得到满意的效果.

  可见,Unity Shader负责定义渲染所需的各种代码\属性和指令等,而材质则允许我们调节这些属性,并将其最终赋给相应的模型.如下图:

 

2.Unity Shader基础:ShaderLab

  学习和编写着色器的学习曲线相对来说是很陡峭的,通常情况下为了实现一个自定义的渲染效果需要和很多文件和设置打交道,因此Unity为开发者提供了更高层级的渲染抽象层-ShaderLab.

  Unity中所有的Unity Shader都是使用ShaderLab编写,ShaderLab是Untiy提供的编写Unity Shader的一种说明性语言.它使用了一些嵌套在花括号内部的语义(syntax)来描述一个UnityShader文件的结构,如Porperties语句块中定义了着色器所需的各种属性,这些属性将会出现在材质面板中.

3.Unity Shader的结构

  在Unity中创建一个默认的Shader,并打开:

Shader "Unlit/NewUnlitShader"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            // make fog work
            #pragma multi_compile_fog

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                UNITY_FOG_COORDS(1)
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                UNITY_TRANSFER_FOG(o,o.vertex);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                // sample the texture
                fixed4 col = tex2D(_MainTex, i.uv);
                // apply fog
                UNITY_APPLY_FOG(i.fogCoord, col);
                return col;
            }
            ENDCG
        }
    }
}

3.1  Shader名称

  第一行代码为:

Shader "Unlit/NewUnlitShader"

  这指明了Shader的位置和名称,在指定Shader时可以在Unlit分类下找到这个Shader:

3.2  材质和Unity Shader的桥梁:Properties

  在Properties语句块中定义了一系列属性,这些属性将出现在材质面板中:

    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
    }

  如代码所示,属性定义的基本格式是: 属性名字  {属性显示名称, 属性类型} = 属性默认值.其中属性名字类似于代码中的字段名,用于在Shader中找到属性并读写属性的值,一般取名时以下划线开头;属性显示名称是在材质中显示的名称(如下图所示),属性类型有Int,Float等(如下表所示).

3.3  重量级成员: SubShader

  每个Unity Shader都必须包含至少一个SubShader语句块.当Unity需要加载这个Unity Shader时,Unity会扫描所有的SubShadre语句块,然后选择第一个能够在目标平台上运行的SubShader.如果都不支持的话,Unity就会使用Fallback语义指定的Unity Shader.

    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            // make fog work
            #pragma multi_compile_fog

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                UNITY_FOG_COORDS(1)
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                UNITY_TRANSFER_FOG(o,o.vertex);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                // sample the texture
                fixed4 col = tex2D(_MainTex, i.uv);
                // apply fog
                UNITY_APPLY_FOG(i.fogCoord, col);
                return col;
            }
            ENDCG
        }
    }

  如上面的代码所示,一个SUbShader中定义了一些自语句块,其中Tags语句块指标签设置,是可选的;RenderSetup是可选的状态设置,也是可选的;Pass语句块中定义了完整的渲染流程,一个Pass语句块定义一个完整的渲染流程,一个SubShader中一定至少包含一个Pass语句块.

  1)Tags标签:一个Tags标签由至少一个键值对组成,键和值都是字符串,类型的.这些键值对标识了我们希望怎样以及何时渲染当前对象.

 

  2)RenderSetup状态设置:ShaderLab提供了一系列渲染状态的设置指令,可以设置显卡的各种状态,如是否开启混合\深度测试等.

  3)Pass语义块:在Pass语义块中可以定义这个Pass语义块的名称,同时也可以使用UsePsss命令来直接使用其他Unity Shader中的Pass,以提高代码的复用性.在Pass语义块中也可以定义局部的Tags和RenderSetup(仅在本Pass语义块内部生效).

3.4  Fallback

  在Unity Shader中,可以在所有SubShader编写完成后,可选性地编写一个Fallback指定,指令可以是Fallback+字符串或者Fallback off.

  Fallback指定指明了当这个Shader中所有的SubShader都无法生效时,可以使用的一个默认Shader,或者使用Fallback off指令关闭Fallback功能.

标签:MainTex,vertex,Shader,Unity,UnityShader,Pass,属性
来源: https://www.cnblogs.com/movin2333/p/16536209.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有