Shader脚本浅析

作者: Kiven_T | 来源:发表于2017-05-26 17:00 被阅读262次

在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路上越走越顺畅~

相关文章

网友评论

    本文标题:Shader脚本浅析

    本文链接:https://www.haomeiwen.com/subject/ymsxfxtx.html