Unity Shader 入门精要 笔记(1)

Untiy Shader 结构

标题
//一、定义shader标题,经过/定义shader目录
Shader "Custom/MyShader"{
    
}
复制代码
property

Properties用于定义Shader中须要使用的属性编程

如下例子分别定义了Int、Float、2D纹理、Vector、Color的属性bash

Shader "Custom/MyShader"{
    Properties {
        _IntValue("IntValue",Int) = 2
        _FloatValue("FloatValue",Float) = 2.0
        _MainTex("MainText",2D) = "black"{}
        _Vector("Vector",Vector) = (1,1,2,3)
        _Color("Color",Color) = (1,1,1,1)
    }
}

复制代码

在Properties中定义的属性最终会在Inspector中出现,开发能够在Inspector中重载其初始值函数

SubShader

定义一个显卡的渲染流程 可配置多个SubShader来定义不一样显卡的渲染任务测试

Shader "Custom/MyShader"{
    Properties{
        
    }
    
    SubShader{
        Tags{} // 可选 标签
        RenderSetup{} //可选 状态
        Pass{ // 表示一次完整的渲染流程
            
        }
    }
    
}
复制代码
RenderSetup

RenderSetup没有固定的关键字和结构体,只需在SubShader里直接书写对应指令便可,支持的指令如代码所示ui

Shader ...{
    ...
    ...{
        //剔除指令 可剔除背面、正面渲染或关闭剔除
        Cull Off/Back/Front 
        //深度测试使用的函数
        ZTest Less Greater/LEqual/GEqual/Equal/NotEqual/Always 
        //深度写入
        ZWrite On/Off 开启/关闭 
        //开启和设置混合模式
        Blend SrcFactor DstFactor
    }
}
复制代码

全部的RenderSetup都会做用于每个Pass,若是须要单独对某个Pass进行不一样的状态设置,能够单独在Pass里定义以上指令spa

Tags

Tags以键值对的形式存在,其定义了 怎样 和 什么时候 进行对象渲染code

Shader ...{
    ...
    ...{
        Tags {
            "Queue" = "Transparent"           //渲染顺序
            "RenderType" = "Opaque"           //着色器分类,用于替换着色器
            "DiableBatching" = "True"         //是否使用批处理
            "ForceNoShadowCasting" = "True"   //是否使用投影
            "IgnorProjector" = "True"         //是否忽略Projector的影响
            "CanUseSpriteAtlas" = "True"      //是否用于精灵模型
            "PreviewType" = "Plane"           //设置在材质面板如何预览该材质
        }
     }
}
复制代码
Pass
Shader ...{
    ...
    ...{
        Pass{
            Name "AAAA" //可选
            Tags {
                "LightMode" = "ForwardBase" //定义Pass在流水线中的的角色
                "RequireOptions" = "SoftVegetation" //定义知足某条件时渲染
            }
            [RenderSetup] //与SubShader里的RenderSetup一致
            // other code
        }
        
        UsePass "...." //能够使用该方式来复用已经定义的Pass 须要用大写字母
    }
}
复制代码
Fallback
Shader ...{
    ...
    
    Fallback "VertexLit" // 若是显卡不支持Pass 用该模式
    
    ...{
        Pass{
            
        }
    }
}
复制代码

Shader着色器

着色器是指用于渲染的一小段函数对象

  • 按照处理的类型分:
    • 顶点着色器:用于负责顶点的几何计算和顶点的颜色计算。
    • 片元着色器:负责片元的几何计算和颜色计算。
  • 根据着色器的代码类型
    • 表面着色器 Unity中对顶点和片元着色器的高度封装而成,不须要咱们操心诸如光照等复杂场景处理。
    Shader ...{
        SubShader{
            Tags {...}
            
            //表面着色器卸载SubShader里
            CGPROGRAM
            
            //在CGPROGRAM和ENDCG之间的就是表面着色器
            #pragma surface surf Lambert
            struct Input{
                float4 color : COLOR;
            };
            void surf(Input IN,inout SurfaceOutput o){
                o.Albedo = 1;
            }
            
            ENDCG
            
        }
        Fallback ...
    }
    复制代码
    • 顶点/片元着色器 基础的着色器语言,也更复杂,封装程度不如表面着色器,因此灵活性比表面着色器高。
    Shader ...{
        SubShader{
            
            Tags{ ... }
            //顶点/片元着色器定义在Pass里
            Pass{
                CGPROGRAM
                //在CGPROGRAM和ENDCG之间的就是顶点/片元着色器
                
                #pragma vertex vert
                #pragma fragment frag
                
                float4 vert(float4 v : POSITION) : SV_POSITION {
                    return mul (UNITY_MATRIX_MVP , v);
                }
                
                fixed4 frag() : SV_Target{
                    return fixed4(1.0,0.0,0.0,1.0);
                }
                
                ENDCG
            }
            
        }
    }
    复制代码
    • 固定函数着色器 一种古老的不可编程的着色器,只能实现固定简单的功能 不展开讲
相关文章
相关标签/搜索