在AR涂涂乐中
里面的Shader复制直接可以用。
//Shader路径
Shader "Color/Special" {
//在面板上显示的内容
Properties {
//纹理贴图
_MainTex ("Base (RGB)", 2D) = "white" {}
//初始Uv的点
_Uvpoint1("point1", Vector) = (0 , 0 , 0 , 0)
_Uvpoint2("point2", Vector) = (0 , 0 , 0 , 0)
_Uvpoint3("point3", Vector) = (0 , 0 , 0 , 0)
_Uvpoint4("point4", Vector) = (0 , 0 , 0 , 0)
}
//shader的核心代码区
SubShader {
//Queue是队列的意思,表示渲染队列,表示希望Unity渲染引擎在什么时候来渲染自己,Queue有5个可选值:BackGround、Geometry、AlphaTest、Transparent、Overlay
//分别对应数字1000、2000、2450、3000、4000,值越小越先渲染,既然可以对应成数字,当然也可以把这些单词当做整形变量来看待
Tags { "Queue"="Transparent" "RenderType"="Transparent" }
//RenderType标签常用的内置值有,Opaque、Transparent、TransparentCutout、Background、Overlay。一个正确的渲染方式在Shader中是必不可少的。
LOD 200
Pass{
Blend SrcAlpha OneMinusSrcAlpha
//在Unity的ShaderLab所提供的结构中,我们可以使用GLSL和Cg/HLSL来写Shader的逻辑代码
//其中GLSL优点在于跨平台性,但是由于OpenGL没有提供着色器编译器,只能有显卡驱动来完成编译,就会出现不同显卡渲染出来的有出入。
//CG也可以跨平台,但是无法发挥OpenGL的最新特性
//HLSL,来自于微软,可以自己控制着色器,在任何硬件上显示效果一样(版本要相同),但是只支持Windows,XBox微软的产品。
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
sampler2D _MainTex;
float4 _MainTex_ST;
float4 _Uvpoint1;
float4 _Uvpoint2;
float4 _Uvpoint3;
float4 _Uvpoint4;
float4x4 _VP;
struct v2f {
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
float4 fixedPos : TEXCOORD2;
} ;
v2f vert (appdata_base v)
{
v2f o;
//把顶点坐标转换到其次裁剪坐标系下,获得NDC(设备坐标)
o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);
float4 top = lerp(_Uvpoint1, _Uvpoint3, o.uv.x);
float4 bottom = lerp(_Uvpoint2, _Uvpoint4, o.uv.x);
float4 fixedPos = lerp(bottom, top, o.uv.y);
o.fixedPos = ComputeScreenPos(mul(UNITY_MATRIX_VP, fixedPos));
return o;
}
float4 frag (v2f i) : COLOR
{
float4 top = lerp(_Uvpoint1, _Uvpoint3, i.uv.x);
float4 bottom = lerp(_Uvpoint2, _Uvpoint4, i.uv.x);
float4 fixedPos = lerp(bottom, top, i.uv.y);
fixedPos = ComputeScreenPos(mul(_VP, fixedPos));
return tex2D(_MainTex, fixedPos.xy / fixedPos.w);
}
ENDCG
}
}
//FallBack "Diffuse"
}
现在就来说说Shader的渲染流水线,
顶点数据 => 顶点着色器 =>曲面细分着色器 => 几何着色器 => 裁剪 => 屏幕映射 => 三角形设置 => 三角形遍历 => 片元着色器 => 逐片元操作 =>屏幕图像
顶点着色器(Vertex Shader):是完全可以编程的,主要用于实现顶点的空间变化,顶点着色。
片元着色器(Fragment Shader):可以编译的,主要对于顶点着色器传来的数据进行插值运算。
Draw Call:CPU通知给GPU的通知指令,在性能优化的时候,需要注意,如果数据过于分散,细碎就会导致CPU提交速度大大提升,导致CPU过载。如果是静态的渲染,最好使用批处理(Batching)进行操作。
要学习Shader,首先需要了解整个过程。然后进行学习,直接死记硬背,会出现无法写新的Shader。
希望身边的小朋友们都能在IT路上越走越顺畅~
网友评论