马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
一、什么是Shader?
shader中文名叫着色器,顾名思义就是给物体着色。那给什么物体着色呢?显而易见就是给屏幕上的物品着色。
二、为什么要学习shader?
相信大家都玩过游戏,游戏中的各种技能特效、河上的水波纹、以及游戏场景中仿真的一草一木那全都是由shader渲染而来的。 许多公司美术在需要某个效果的shader时,他们使用工具拖动来完成shader编写以达到他们想要的效果,但是通常这种shader如果不优化的话就会很消耗游戏性能。而我们学会shader后,在优化游戏时就可以对shader进行优化,以及编写美术需要的shader。 最最最重要的是:加薪工具,加薪工具,加薪工具!!!
三、UnityShader种类
通常来说unity分为三种:
1. Surface Shader(表面着色器) 2. Vertex/Fragment Shader(顶点/片元着色器) 3. Fixed Function Shader(固定函数着色器)
四、三种Shader的区别以及相同点区别:
1. Surface Shader(表面着色器)是unity自己创造的一种着色器代码类型。它需要的代码量很少, 但渲染的代价比较大。本质上与顶点/片元着色器是一样的。
2. Vertex/Fragment Shader(顶点/片元着色器)当unity提供一个表面着色器时,它在背后仍然把 它转换成顶点/片元着色器。顶点/片元着色器与表面着色器的不同之处在于前者的代码是写在Pass 语义块内而非CGPROGRAM和ENDCG之间。 3. Fixed Function Shader(固定函数着色器)为固定功能渲染管线的具体表现。通常作用于功能较 简单兼容比较老的机器。unity5.2后,所有固定函数着色器都会被unity编译成对应的顶点/片元着 色器,因此真正意义上的固定函数着色器已经不存在了。
相同点:
1. 都必须从唯一一个根Shader开始。 2. Prooerties参数部分,作用以及语法完全相同。 3. 具体功能都在SubShader里。 4. 都可以打标签和Fallback。 5. 表面着色器与顶点/片元着色器中CGPROGRAM和ENDCG之间的代码都是用CG/HLSL编写 6. .......
五、代码示例
1、Surface Shader示例代码
- Shader "Example/Surface Shader" {
- SubShader {
- Tags { "RenderType" = "Opaque" }
- CGPROGRAM
- #pragma surface surf Lambert
-
- struct Input {
- float4 color : COLOR;
- };
- void surf (Input IN, inout SurfaceOutput o) {
- o.Albedo = 1;
- }
- ENDCG
- }
- Fallback "Diffuse"
- }
复制代码
2、Vertex/Fragment Shader示例代码
- Shader "Example/Vertex Fragment Shader"
- {
- SubShader{
- Pass{
- CGPROGRAM
- #pragma vertex vert
- #pragma fragment frag
-
- float4 vert(float4 v : POSITION) :SV_POSITION{
- return mul(UNITY_MATRIX_MVP,v);
- }
- float4 frag() : SV_TARGET{
- return fixed4(1.0,0.0,0.0,1.0);
- }
- ENDCG
- }
- }
- }
复制代码
3、Fixed Function Shader示例代码
- Shader "Example/Fixed Function Shader"{
- Properties
- {
- _MainColor("Main Color", Color) = (1,1,1,1)
- }
- SubShader
- {
- Pass
- {
- Color[_MainColor]
- }
- }
- Fallback "Diffuse"
- }
复制代码
|