Unity Shader(一): 入门概念和代码
写在前面首先感谢大佬的分享,膝盖先行奉上:
因为好久已经没有回归Unity的怀抱了(真香!!!吹爆!!!
决定打算从头开始复盘各个功能。
本文是对自己学习大佬分享的1-5章进行总结,详细内容看大佬的文章就可以。
渲染管线
当然首先要学习渲染管线,不然对Shader每个阶段做了什么就会容易产生混淆:
其中VS和PS是可编程的阶段,UnityShader的原理也是对VS传入的数据在PS中进行修改。
Untiy创建Shader种类
Standard Surface Shader
标准表面着色器,是一种基于物理的着色系统(使用了Physically Based Rendering(简称PBR)技术,即基于物理的渲染技术),以模拟现实真实的方式来模拟材质与灯光之间的关系,可以很轻易的表现出各种金属反光效果,同时此种Shader的书写逻辑也更符合人类的思维模式。
Unlit Shader
Vertex/Fragment Shader,也就是最基本的顶点片断着色器,不受光照影响的Shader,多用于特效、UI上的效果制作。
Image Effect Shader
也是顶点片断着色器,只不过是针对后处理而定制的模版。
Compute Shader
Compute Shader是运行在图形显卡上的一段程序,独立于常规渲染管线之外的,它可以直接将GPU作为并行处理器加以利用,从而使GPU不仅具有3D渲染能力,还具有其他的运算能力。
Shader Variant Collection
Shader变体收集器,是对Shader变体进行打包用的容器。
Unity的Shader结构
代码--阶段性自我小测交作业结果
针对
交作业,有题目怎么能没有答案抄(笑~
Shader "Unlit/Unit"{
Properties{
_MainTex("Main Texture", 2D) = "white"{}
_DisplacementTex("Displacement Texture", 2D) = "white"{}
_Magnitude("Magnitude", Range(0, 1)) = 0
_Tween("Tween", Range(0, 1)) = 0
_Color("Color", Color) = (1,1,1,1)
//Properties
// {
// _Color("我是Color", Color) = (1,1,1,1)
// }
// 变量名:_Color
// 显示名称:我是Color
// 类型:Color
// 默认值:(1,1,1,1)
}
SubShader
{
// Transparent 表示是透明通道
Tags
{
"Queue" = "Transparent"
}
Pass
{
Blend SrcAlpha OneMinusSrcAlpha
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// 对上面声明的值进行定义
sampler2D _MainTex;
sampler2D _DisplacementTex;
float _Magnitude;
float4 _Color;
float _Tween;
#include "UnityCG.cginc"
// 获取模型数据
struct appdata
{
float4 vertex : POSITION;
float2 uv: TEXCOORD0;
};
// 存放计算结果
struct v2f
{
float4 vertex : SV_POSITION;
float2 uv: TEXCOORD1;
};
// 拿取模型数据计算后传给fragment shader
v2f vert(appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
return o;
}
// 拿取计算结果作用于目标
float4 frag(v2f i) : SV_Target
{
float2 disuv = float2( i.uv.x + _Time.x*2 , i.uv.y + _Time.x*2 );
float2 dis = tex2D(_DisplacementTex,disuv).xy;
dis = ((dis*2)-1)*_Magnitude;
//lerp
float4 tex_color = lerp(tex2(_MainTex, i.uv), tex2D(_DisplacementTex, i.uv),_Tween);
// distortion
float4 tex_color1 = tex2D(_MainTex, i.uv + dis)*_Color;
// multi UV
float4 tex = tex2D(_MainTex, i.uv);
float luminance = 0.2125 * tex.rgb.r + 0.07154 * tex.rgb.g + 0.0721 * tex.rgb.b;
// luminance
loat4 tex1 = float4(luminance,luminance,luminance, tex.rgba.a);
return tex_color1;
}
ENDCG
}
}
}
图 1 新增一个_Color属性,并将其与主纹理的颜色相乘
图 2用uv值计算颜色值的方法,将其结果与主纹理的颜色相乘
图 3两张纹理,以及第五章讲到的拖动条,当移动滑杆时在两张纹理中进行插值
图 4对纹理采样时,将uv乘2
图 5明亮度(luminance)公式来算出一个明亮度值,然后将红绿蓝通道都设置为明亮度值,透明度通道则用对图片采样获得的透明度
图 6 返回颜色与自定义的颜色属性相乘
用心的完成了作业,有空再补充写点什么吧。
页:
[1]