问:shader是什么?
答:shader中文名叫着色器,是一段能够针对3D对象进行操作、并被GPU所执行的程序。通过这些程序,程序员就能获得绝大部分想要的3D图形效果
总结:通过GPU和电脑沟通怎么画的一种语言。
GPU的渲染流程
==>>计算机中的三维模型
计算机中的三维模型本质上是一组数据,包括空间中顶点的位置、法线方向、顶点颜色等等
GPU就是通过包括三维模型在内的一系列数据进行计算,将结果提交给显示器显示的设备
准备数据就是美术做的事情,告诉GPU如何计算就是Shader程序员做的事情
drawcall:CPU把数据给GPU的阶段,时间比较长。解决:尽量多地共用相同的shader。
Shader "MyShader/SimpleDiffuse"
{
Properties{//在面板显示的特性
_Diffuse("DiffuseColor",Color) = (1,1,1,1)
}
SubShader{//可以有多个SubShaser,只执行第一个可用的
Pass{//多个Pass都执行
Tags{"LightMode" = "ForwardBase"}
CGPROGRAM
#pragma vertex vert //顶点着色器
#pragma fragment frag //片段着色器
#include "Lighting.cginc"
fixed4 _Diffuse;//float 32bit, half 16bit,fixed 11bit:color [0,1]
//a-应用 v-视图 f-片段
struct a2v {
float4 vertex:POSITION;//POSITION:语义: GPU在哪里去存取数据
float3 normal:NORMAL;
};
struct v2f {
float4 Pos:SV_POSITION;//SV_POSITION(POSITION) SV_TARGET(COLOR)
fixed3 color : COLOR;
};
v2f vert(a2v v) {
v2f o;
o.Pos = UnityObjectToClipPos(v.vertex);//从模型空间变化到裁剪空间
float3 nDir = normalize(mul((float3x3)unity_ObjectToWorld, v.normal));
//顶点法线从模型空间变换到世界空间
float3 lDir = normalize(_WorldSpaceLightPos0.xyz);//用于平行光
fixed3 diffuse = _LightColor0*_Diffuse*saturate(dot(nDir, lDir));
//数值保证在0~1之间
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
o.color = ambient + diffuse;//ambient指的环境光 颜色相加
return o;
}
fixed4 frag(v2f IN) :SV_TARGET{
return fixed4(IN.color,1.0);
}
ENDCG
}
}
}