一、表面着色器
1.1 简介
表面着色器代码直接在SubShader中编写,不需要使用Pass,编译器会将代码编译到合适的Pass中
1.2 标签
硬件将通过判定标签来决定什么时候调用该着色器
属性RenderType:
值Opaque:在渲染非透明物体时调用
值Transparent:表示渲染含有透明效果的物体时调用
例:Tags { "RenderType"="Opaque" }
1.3 申明变量
#pragma surface surfaceFunction lightModel [optionalparams] //声明写一个表面Shader
名字 | 说明 |
surface | 申明这是表面着色器 |
surfaceFunction | 着色方法的名字,如surf,在下面会出现surf函数 |
lightModel | 使用的光照模型,如Lambert(就是普通的diffuse) |
顶点处理函数 -> 表面处理函数 -> 光照模型函数 ->颜色值
sampler2D _MainTex;
sampler2D就是GLSL中的2D贴图的类型,相应的还有sampler1D,sampler3D,samplerCube等格式
答:这个shader是由两个相对独立的块组成的,外层的属性、回滚等是Unity可以使用和编译的ShaderLab;CGPROGRAM...ENDCG代码块是一段CG程序。对于这段CG程序,要想访问在Properties中定义的变量,必须使用和之前变量相同的名字进行声明。sampler2D _MainTex; 再次声明并链接了_MainTex,使得接下来的CG程序能够使用这个变量
1.4 函数定义
1.5 Input结构
Input是需要我们去定义的结构,可以把所需要参与计算的数据都放到这个Input结构中,传入surf函数使用作为输入的结构体必须命名为Inputfloat和vec都可以在之后加入一个2到4的数字,来表示被打包在一起的2到4个同类型数,如float2表示由两个float数构成的一个数据变量的访问:可以只使用名称来获得整组值,也可以使用下标的方式(比如.xyzw,.rgba或它们的部分比如.x等)来获得某个值。在CG程序中约定,在一个贴图变量(如_MainTex)之前加上uv两个字母,就代表提取它的uv值UV mapping的作用是将一个2D贴图上的点按照一定规则映射到3D模型上,是3D渲染中最常见的一种顶点处理手段。
1.5 SurfaceOutput结构
着色函数已经定义好了输出结构,但内容是空白的,需要向里面填写输出,这样就可以完成着色了
truct SurfaceOutput {
half3 Albedo; //像素的颜色,反射值
half3 Normal; //像素的法向值
half3 Emission; //像素的发散颜色
half Specular; //像素的镜面高光
half Gloss; //像素的发光强度
half Alpha; //像素的透明度
};
half指的是半精度浮点数,精度最低,运算性能相对比高精度浮点数高一些,因此被大量使用1.5 表面着色函数
二、代码示例
Shader "liulongling/BasicDiffuse" {
Properties {
_Color ("Color", Color) = (1,1,1,1)
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_Glossiness ("Smoothness", Range(0,1)) = 0.5
_Metallic ("Metallic", Range(0,1)) = 0.0
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
// Physically based Standard lighting model, and enable shadows on all light types
#pragma surface surf Standard fullforwardshadows
// Use shader model 3.0 target, to get nicer looking lighting
#pragma target 3.0
sampler2D _MainTex;
struct Input {
float2 uv_MainTex;
};
half _Glossiness;
half _Metallic;
fixed4 _Color;
void surf (Input IN, inout SurfaceOutputStandard o) {
// Albedo comes from a texture tinted by color
fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
o.Albedo = c.rgb;
// Metallic and smoothness come from slider variables
o.Metallic = _Metallic;
o.Smoothness = _Glossiness;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}
<<Unity Shaders and Effects Cookbook>>