Shader基本
- surface shaders(是对下一种shader的包装)
- vertex and fragment shaders
- fixed function shaders
Unity使用ShaderLab syntax语法
不区分大小写
Shader lab基本结构
Shader "Custom/ShaderName"{
//Custom为使用Shader时的分类目录,ShaderName为Shader名
Properties
{
//属性
//这里的属性会在Material的面板里显示
_Color ("Color", Color) = (1,1,1,1)
//_Color是Shader里的变量名,"Color"是在Material里的变量名,后一个Color是ShaderLab里的类型,即Color类型,登号后面为默认值,使用0~1表示
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_Glossiness ("Smoothness", Range(0,1)) = 0.5
_Metallic ("Metallic", Range(0,1)) = 0.0
}
SubShader
{
//在这里编写Shader代码,至少需要有一个SubShader
//如果有多个SubShader,会自顶向下寻找第一个能运行的SubShader
}
FallBack "Diffuse"
//当所有的SubShader都失败时,指定一个Unity内置Shader
}
Shader组成
- SubShader Tags 标签
- pass 渲染通道
- material
- diffuse
- ambient
- Specular
- Shininess
- Emission
- culling and depth testing
- Blending
- PassTag
- Stencil
- Name
- Legacy Lighting
- Legacy Texture Combiners
- Legacy Alpha Testing
- Legacy Fog
- Legacy BindChannels
- material
- usepass
- grabpass
Fixed function shader
使用一系列命令进行物体的着色
实现特定功能,运行快,硬件支持良好
Shader "Custom/Test2"
{
Properties
{
_Color("MainColor",color) = (1,1,1,1)
_Ambient("Ambient",color) = (0.3,0.3,0.3,0.3)
_Specular("Specular",color) = (1,1,1,1)
_Shininess("Shininess",range(0,8)) = 4
_Emission("Emission",color) = (1,1,1,1)
_Constant("ConstantColor",color) = (1,1,1,0.3)
_MainTex("MainTex",2D)=""
_SecondTex("SecondTex",2D) = ""
//如果下面有非贴图类型则需要把""改成"XXX"{}
}
SubShader
{
//ShaderLab: SubShader Tags。这里设置的是渲染队列
//简单来说是让远的物体先渲染,近的物体后渲染覆盖在上面
Tags { "Queue" = "Transparent"}
//通道块
pass
{
//ShaderLab: Blending
//Blending 决定游戏对象的渲染如何和已经渲染的物体(环境)相作用进行渲染,和PS的混合模式相似
//这里启用了透明度混合
Blend SrcAlpha OneMinusSrcAlpha
//取消下一行注释将直接使用color进行渲染,一般不用
//color[_Color]
material
{
//主颜色
diffuse[_Color]
//环境光影响颜色
ambient[_Ambient]
//高光颜色
Specular[_Specular]
//高光
Shininess[_Shininess]
//自发光
Emission[_Emission]
}
//启用顶点?光照
lighting on
//高光将在贴图渲染后再渲染
Separatespecular on
//设置贴图
Settexture[_MainTex]
{
//combine是关键词,texture指传参_MainTex,primary是指在material里计算的结果
//因为texture和primary数值都是0~1,相乘后将变暗,所以用double提高亮度
combine texture*primary double
}
Settexture[_SecondTex]
{
//添加一个传参,只能为Color类型
constantColor[_Constant]
//previous是指上一个计算结果(这里是Settexture[_MainTex])
//,之后是指Alpha的通道将被单独计算
combine texture*previous double,texture*constant
}
//Settexture次数是有上限的,一般最少为2次,硬件越好可以混合越多次
}
}
}
本文介绍了Unity中Shader的基础知识,包括Surface Shaders、Vertex and Fragment Shaders以及Fixed Function Shaders。重点讲解了Fixed Function Shader,它是通过一系列命令来实现物体着色,速度快且硬件支持良好。在Unity中,ShaderLab语法被用于编写Shader,其结构包含SubShader、Tags、Pass等,并涉及material属性如diffuse、specular等。

3761

被折叠的 条评论
为什么被折叠?



