人气 287

[综合技术] UnityShader学习笔记(一) [复制链接]

九艺网 2019-8-9 17:14:52

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x

一、什么是Shader?

shader中文名叫着色器,顾名思义就是给物体着色。那给什么物体着色呢?显而易见就是给屏幕上的物品着色。


141113jrc78vlybi2cun8v.jpg.thumb.jpg


二、为什么要学习shader?

相信大家都玩过游戏,游戏中的各种技能特效、河上的水波纹、以及游戏场景中仿真的一草一木那全都是由shader渲染而来的。

许多公司美术在需要某个效果的shader时,他们使用工具拖动来完成shader编写以达到他们想要的效果,但是通常这种shader如果不优化的话就会很消耗游戏性能。而我们学会shader后,在优化游戏时就可以对shader进行优化,以及编写美术需要的shader。

最最最重要的是:加薪工具,加薪工具,加薪工具!!!


095924w8n8aw84cz4wgq14.gif

三、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示例代码
  1. Shader "Example/Surface Shader" {
  2.         SubShader {
  3.           Tags { "RenderType" = "Opaque" }
  4.           CGPROGRAM
  5.           #pragma surface surf Lambert
  6.            
  7.           struct Input {
  8.               float4 color : COLOR;
  9.           };
  10.           void surf (Input IN, inout SurfaceOutput o) {
  11.               o.Albedo = 1;
  12.           }
  13.           ENDCG
  14.         }
  15.         Fallback "Diffuse"
  16. }
复制代码



2、Vertex/Fragment Shader示例代码
  1. Shader "Example/Vertex Fragment Shader"
  2. {
  3.     SubShader{
  4.         Pass{
  5.             CGPROGRAM
  6.             #pragma vertex vert
  7.             #pragma fragment frag

  8.             float4 vert(float4 v : POSITION) :SV_POSITION{
  9.                 return mul(UNITY_MATRIX_MVP,v);
  10.             }
  11.             float4 frag() : SV_TARGET{
  12.                 return fixed4(1.0,0.0,0.0,1.0);
  13.             }
  14.             ENDCG
  15.         }
  16.     }
  17. }
复制代码

3、Fixed Function Shader示例代码
  1. Shader "Example/Fixed Function Shader"{
  2.     Properties
  3.     {
  4.         _MainColor("Main Color", Color) = (1,1,1,1)
  5.     }
  6.     SubShader
  7.     {
  8.          Pass
  9.             {
  10.                 Color[_MainColor]
  11.             }
  12.         }
  13.         Fallback "Diffuse"
  14. }
复制代码

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

QQ|手机版|小黑屋|九艺游戏动画论坛 ( 津ICP备2022000452号-1 )

GMT+8, 2024-3-29 19:25 , Processed in 0.139758 second(s), 26 queries .

Powered by Discuz! X3.4  © 2001-2017 Discuz Team.