Unity3D — Shader 固定管线着色器

文章目录

  • 固定管线着色器
    • Properties
    • SubShader标签Queue
    • Material
    • 多边形剔除
    • 深度
    • 混合
    • TextureSetup
    • 通过代码控制Shader属性

固定管线着色器

  • 应⽤于旧设备
  • 简单
  • 灵活度低
  • 使用ShaderLab语法,⽆CG语⾔

Properties

// 创建Shader   用ShaderLab写骨骼
Shader "Zhongdudu/Text"
{
	// Shader的外部属性(在面板上可以调节)
	Properties
	{
		//格式 属性名(面板显示名,类型)=初始值 在这里不能写分号,会报错

		//浮点数
		_FloatValue("FloatValue",Float)=0.4

		//范围浮点数
		_FloatRange("FloatRange",Range(0.1,1))=0.7

		//四维数
		_VectorValue("VectorValue",Vector)=(1,2,3,4)

		//颜色
		_Color("Color",Color)=(1,0,0,1)

		//2阶贴图
		_Texture2D("MainTexture",2D)=""{}

		//非2阶贴图
		_Rect("RectValue",Rect)=""{}

		//立方体贴图
		_Cube("Cube",Cube)=""{}
	}
	// 一个SubShader就是一个渲染方案
	// 先执行第一个SubShader,根据性能来判断是否执行下一个SubShader,SubSHader的数量根据需求而定

	// 效果最好,但性能消耗最大
	SubShader
	{
		// 每个SubShader必须包含至少一个Pass通道,表面着色器除外
		Pass  
		{
			
		}
	}

	// 效果最差,但性能消耗最小
	SubShader
	{
		Pass
		{
		
		}
	}

	// 当前方的所有SubShader都无法执行,才会执行这个
	Fallback "Diffuse"
}

SubShader标签Queue

渲染的先后顺序

Shader "Zhongdudu/Five"
{
	Properties
	{
		
	}

	SubShader
	{
		//标签
		Tags
		{
			// "Key"="Value"
			// Background后台 1000  Geometry⼏何体 2000  Transparent透明  3000 Overlay覆盖 4000
			// 值越小越先渲染,值越大的越不会被其他物体遮挡
			"Queue"="Background+1"
		}
		//关闭深度测试
  	ZText Off

	    Pass
		{
  		
 		}
	}

	Fallback "Diffuse"
}

Material

Shader "Zhongdudu/One"
{
	Properties
	{
		_DiffuseColor("漫反射颜色",Color)=(1,0,0,1)
		_AmbientColor("环境光反射颜色",Color)=(1,0,0,1)
		_SpecularColor("⾼光颜色",Color)=(1,0,0,1)
		_EmissionColor("⾃发光颜色",Color)=(1,0,0,1)
		_Float("光泽度",Range(0.1,100))=0.7
	}

	SubShader
	{
	    // Color 颜色
		Pass
		{
			// 固定渲染一个颜色,在( )中直接赋值
			Color(1,0,0,1)
			// 使用变量控制颜色,记得使用 [ ]
			Color[_Color]
		}

		// Material
		Pass
		{
			// 开启/关闭顶点光照 On/Off
			Lighting On
			// 开启/关闭镜⾯反射 On/Off
			SeparateSpecular On 

			// 在写漫反射/环境光反射颜⾊/光泽度/⾼光颜⾊/⾃发光颜⾊等功能时需要写该命令
			Material
			{
				// 漫反射
				Diffuse[_DiffuseColor]
				//环境光反射颜⾊
				Ambient[_AmbientColor]
				//光泽度
				Shininess[_Float]
				//⾼光颜⾊
				Specular[_SpecularColor]
				//⾃发光颜⾊
				Emission[_EmissionColor]
			}
		}
	}

	Fallback "Diffuse"
}

多边形剔除

哪一面显示,哪一面不显示
例如:

  • Quad或地形,正面显示,背面不显示
  • Cube外部显示,内部不显示
SubShader
{
    Pass
	{
		// 剔除背面 显示正面
		Cull Back
	}
	Pass
	{
		// 剔除正面 显示背面
		Cull Front
	}
	Pass
	{
		// 正反两面都显示
		Cull Off
	}
}

深度

深度就是根据顶点和像素距离摄像机的距离

Shader "Zhongdudu/Three"
{
	Properties
	{
		_Mask("遮挡时的颜色",Color)=(0,1,0,1)
		_Noocclusion("没被遮挡时的颜色",Color)=(1,0,1,1)
	}
	SubShader
	{
	    Pass
		{
			//ZTest (Less | Greater | LEqual | GEqual |Equal | NotEqual | Always) 分别表示 小于 | 大于 | 小于等于 | 大于等于 | 等于 | 不等于 | 总是
			ZTest Greater
			//关闭深度缓存,只渲染我自己
			ZWrite Off
			//设置颜色
			Color[_Mask]
		}
		Pass 
		{
			ZTest LEqual
			//设置颜色
			Color[_Noocclusion]
		}		
	}
	Fallback "Diffuse"
}

混合

Shader "Zhongdudu/Four"
{
	Properties
	{
		_Color("Color",Color)=(1,0,0,1)
	}
	SubShader
	{
	    Pass
		{
  		// 开启透明混合
  		Blend SrcAlpha OneMinusSrcAlpha
			// 相加
			Blend One One
			// ⽐较柔和的相加
			Blend One OneMinusDstColor
			// 乘法
			Blend DstColor Zero
			// 2倍乘法
			Blend DstColor SrcColor
  		// 开启顶点光照
  		Lighting On
  		Material
			{
   			Diffuse[_Color]
			}
 		}
	}
	Fallback "Diffuse"
}

TextureSetup

Shader "Zhongdudu/Five"
{
    Properties
    {
        _MainTex("纹理图片",2D)=""{}
        _SeconTex("第二个纹理",2D)=""{}
        _MainCol("漫反射颜色",Color)=(1,0,0,1)
      	_LerpValue("插值比例",Range(0,1))=0
    }
    
    SubShader
    {
        Pass
        {
            Lighting On     
            Material
            {
                Diffuse[_MainCol]
            }

			//设置纹理
            //SetTexture[_MainTex]
            //{
            //    // 融合纹理和其他
            //    // Combine:融合命令
            //    // Primary 是来⾃光照计算的颜⾊或是当它绑定时的顶点颜⾊
            //    Combine texture * Primary
            //}
            SetTexture[_MainTex]
            {
            	// 纹理的颜色与上面的固定颜色做混合
                ConstantColor[_MainCol]
                // combine src1 * src2 更暗
				// combine src1 + src2 更亮
				// combine src1 - src2
                Combine texture * Constant Quad
                // Texture是在SetTexture中被定义的纹理的颜⾊
                // Constant是被ConstantColor定义的颜⾊
                // 双倍/四倍 Double / Quad
            } 
            SetTexture[_SecondTex]
            {
                ConstantColor(0,0,0,[_LerpValue])
                // 使⽤源2的透明度通道值在源3和源1中进⾏插值,注意插值是反向的:当透明度值是1是使⽤源1,透明度为0时使⽤源3
                Combine Previous lerp(Constant) texture
                // Previous 是上⼀次SetTexture的结果
            }
        }
    }
    Fallback "Diffuse"
}

通过代码控制Shader属性

using UnityEngine;

public class SetShaderProperties : MonoBehaviour {

    private MeshRenderer meshRenderer;

    private void Awake()
    {
        meshRenderer = GetComponent<MeshRenderer>();
    }

    private void Update()
    {
        //获取此时材质中Shader中属性的值
        float lerpValue = meshRenderer.material.GetFloat("_LerpValue");

        lerpValue += Time.deltaTime/5;

        //设置材质中Shader中属性的值
        //meshRenderer.material.SetFloat("_LerpValue", lerpValue);

        meshRenderer.material.SetTextureOffset("_SecondTex", new Vector2(-Time.time,0));
    }
}

你可能感兴趣的:(Unity基础知识,shader,unity)