当前位置:   article > 正文

《UnityShader入门精要》UnityShader基础_unity shader是什么语言

unity shader是什么语言

UnityShader的定义

UnityShader指的是一个ShaderLab文件——硬盘上以.shader作为文件后缀的文件
UnityShader是Unity为开发者 提供的高级层的渲染抽象层

ShaderLab是什么

ShaderLab是unity提供一门专门为UnityShader服务的语言,所有的UnityShader都是用ShaderLab编写
用语义描述UnityShader的文件结构,语义有Properties(属性),Subshader,Fallback

UnityShader对比传统shader的优缺点

(1)传统shader只能编写特定类型的shader,例如顶点着色器和片段着色器只能独立写在一份文件中,UnityShader可以在一个文件里写顶点着色器和片段着色器。
(2)传统shader无法在shader(顶点着色器,片段着色器)中设置一些渲染设置,例如是否开启混合,深度测试,模板测试等,需要在另外的代码中自行设置,UnityShader可以在shader里通过一行特定的指令设置。
(3)传统shader需要编写代码设置着色器的输入和输出,处理输入输出的位置对应关系等,UnityShader在特定语句块中声明一些属性,就可以依靠材质改变属性,提供直接访问模型自带数据(如顶点位置,纹理坐标,法线等)的方法。
(4)UnityShader的高度封装性,限制shader类型和语法。

UnityShader如何使用

(1)创建一个材质 Material
(2)创建一个UnityShader,并把该shader赋给上面的材质
(3)把材质赋给渲染的对象
(4)在材质面板中调整UnityShader的属性

UnityShader结构

伪代码:
Shader "Unlit/001"
{
Properties
{
	         //各种属性
}
SubShader
{
	//标签可选 key = value
	Tags 
	{
              //各种标签
    }
    //状态可选
	 RenderSetup
	 {
	     	 //各种状态
	 }
	Pass
	{
		//CG语言写的顶点,片段着色器
		CGPROGRAM
		#pragma vertex vert  //顶点着色器名字定义
		#pragma fragment frag //片段着色器名字定义
		//顶点着色器实现
		v2f vert (appdata v)
		{
		}
		//片段着色器实现
		fixed4 frag (v2f i) : SV_Target
		{
		}
		ENDCG
	}
	Fallback
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

解析:
名字:
Shader “Unlit/001” ,001是shader名字,Unlit是材质面板的下拉列表
属性:(CG代码直接使用属性值进行计算,通过调整材质面板的属性值来实现效果)
Properties
{
Name(“displayName”,PropertyType) = DefaultValue
Name(“displayName”,PropertyType) = DefaultValue
//更多属性
}
Name是属性名,在着色器中使用
displayName是显示的名称,材质面板上出现的名字
PropertyType是类型
DefaultValue是默认值

常用类型如下:
_Int (“Int”,Int) = 2 //整数
_Float (“Float”,float) = 2.0 //小数
_Range (“Range”,range(0.0,2.0)) = 1.5 //随机数
_Color (“Color”,Color) = (1,1,1,1) //颜色
_Vector(“Vector”,Vector) = (1,1,2,3) //向量
_MainTex (“Texture”, 2D) = “内置的纹理名称(white,black,gray,bump)” {纹理属性} //2D纹理
_Cube (“Cube”,Cube) = “”{} //天空盒
_3D (“3D”,3D) = “”{} //3D纹理

SubShader:
可以多个SubShader,但至少要一个
Tag(标签)和RenderSetup(状态)可选,多个Pass会造成渲染性能下降,因为调用一次Pass就 产生一次DrawCall。Tag和RenderSetup可以在SubShader里Pass外定义,也可以在Pass内定义,如果在Pass内定义,则只用于该Pass,如果在SubShader里Pass外定义,则应用全部Pass,如果定义重复,则使用SubShader里Pass外定义。
Tag(标签):一个键值对,怎样渲染
“Queue” = “Transparent” //渲染顺序
“RenderType”=“Opaque” //渲染类型 着色器替换功能
“DisableBatching” = “True”//是否进行合批
“ForceNoShadowCasting” = “True”//是否投射阴影
“IgnoreProjector” = “True”//受不受Projector的影响,通常用于透明物体
“CanUseSpriteAtlas” =“Flase”//是否用于图片的shader,通常用于UI
“PreviewType” = “Plane”//用于shader面板的预览类型
RenderSetup(状态):渲染状态的设置指令
剔除模式:
(1) CullBack //剔除背面
(2) CullFront //剔除正面
(3) CullOff //关闭剔除
设置深度测试使用的函数:
(1)ZTest Less Greater //小于
(2)ZTest LEqual //小于等于
(3)ZTest GEqual //大于等于
(4)ZTest Equal //等于
(5)ZTest NotEqual //不等于
(6)ZTest Always //总是
开启/关闭深度写入
(1)ZWrite On //开启
(2)ZWrite Off //关闭
开启并设置混合模式
Blend Src(源) Dst(目标)
Pass:
Pass{
Name “MyShader” //Pass的名字,用于UsePass使用别的shader的Pass,但名字必须大写
Tag
RenderSetup

Fallback:如果全部SubShader没有一个显卡能跑,则调用。
表面着色器(Surface Shader):Unity封装多种顶点着色器和片段着色器,只需传参调用,渲染代价比较大
自己编写着色器,比较灵活

材质面板截图参考

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/82047
推荐阅读
相关标签
  

闽ICP备14008679号