Unity3D Shader 入门精进

时间:2026-01-14

Unity3D Shader 入门精进

http://

1 今日精选-Unity3D Shader 入门精进

背景

我们都应该经历过这样的过程。阅读了各种大牛小牛发表的关于Shader 的文章,他们一般都会贴出相关的代码和效果图,看起来酷酷的样子。我们也是走马观花的看了一下代码,有种一知半解的成就感。等真有一天需要开发相关的Shader 效果的时,如果没有保存相关的链接,大脑还是一片空白,然后再重头Baidu (yi ge sha zi )一遍。实际上这种学习方式是很低效的。说白了就是没有去深刻的研究,没有仔细经过大脑的思考和记忆。

本篇的目的主要是想通过另外一种方式,通过先思考再实践的推导过程,加深大家的印象,提高学习的效果,所以本文取名叫做Shader 入门精进。由于是精进,当然是大家应该有一定的Shader 编程基础。如果没有还是建议去看一些入门的文章有一个大概印象。

本篇不想通过什么高大上的效果,或者教条的指明一些基础知识,而是想通过默认的 shader 的简单代码来展开。

实现

我们知道 是3D 引擎来做模拟2d 的游戏的。

干货来啦!让我们不看答案自己先回答一下下面问题,记得一定要自己先思考哦。

Unity3D Shader 入门精进

http:// 2 问题1:如果让我们来写一个2D 的默认Shader 着色器,它应该具有什么特质呢?

1、没有光照也不需要光照;

2、传入的主纹理就是2D 的图像信息;

3、我们普遍认知的2D 图像是有透明信息的,所以渲染的是透明物体;

4、由于是透明物体,那么根本不需要深度测试;

5、同样物体的背面也是不需要渲染的(因为我们根本看不到);

6、使用的是正交投影,所以没有透视投影的实质内容。

问题2:梳理一下Unity3D 系统提供的Shader 的类型 ,如果是你你会选择哪一种呢?

Unity 支持三种shader:

1) Surface Shaders: 主要处理光照和阴影,利用了Unity 的光照

流水线,是一种较高层次的抽象。如果不使用光照则不要使用这种

shader ,因为会有不必要的性能消耗。使用Cg/HLSL 编写shader

代码,但最终的shader 是需要编译生成的。

2)Vertex and Fragment Shaders: 这个就是一般话的shader

了,可以实现任意效果,当然也要处理所有的事情,并且不能利用

Unity 的光照系统了。同样也使用Cg/HLSL 编写。

3)Fixed Function Shaders: 固定功能,只能实现简单效果,且

某些平台支持不好,因此已经不推荐使用了,完全使用ShaderLab

编写。

Unity3D Shader 入门精进

http://

3 答案是:显然没有光照模型的存在,那么可以排除固定管线和还有surface ,然后只剩下一个可编程Vertex and Fragment Shaders 类型可以选了。 好了,我的思考就到这里,下面我们揭晓答案吧。

让我们看一下默认的2D Shader 代码:

[C#] 纯文本查看 复制代码

?

001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 Shader \"Sprites/Default\"

{

Properties

{

[PerRendererData] _MainTex

(\"Sprite Texture\", 2D) =

\"white\" {}

_Color (\"Tint\", Color) =

(1,1,1,1)

[MaterialToggle] PixelSnap

(\"Pixel snap\", Float) = 0

}

SubShader

{

Tags

{

\"Queue\"=\"Transparent\"

\"IgnoreProjector\"=\"True\"

\"RenderType\"=\"Transparent\"

Unity3D Shader 入门精进

http://

4 034 03

5 03

6 03

7 03

8 03

9 040 041 042 043 044 045 046 047 048 049 050 051 052 053 054 055 056 057 058 059 060 061 062 063 064 065 066 067 068 069 070 071 072 073 074 075 076 077 \"PreviewType\"=\"Plane\"

\"CanUseSpriteAtlas\"=\"True\"

}

Cull Off //关闭背面剔除

Lighting Off //关闭灯光

ZWrite Off //关闭Z 缓冲

Blend One OneMinusSrcAlpha //混合源系数one(1) 目标系数OneMinusSrcAlpha(1-one=0)

Pass

{

CGPROGRAM

#pragma vertex vert

#pragma fragment frag

#pragma multi_compile _ PIXELSNAP_ON //告诉Unity 编译不同版本的Shader,这里和后面vert 中的PIXELSNAP_ON 对应

#pragma shader_feature ETC1_EXTERNAL_ALPHA

#include \"UnityCG.cginc\"

struct appdata_t //vert 输入

{

float4 vertex : POSITION;

float4 color : COLOR;

Unity3D Shader 入门精进

http://

5 078 079 080 081 082 083 084 085 08

6 08

7 08

8 08

9 090 091 092 093 094 095 096 097 098 099 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 float2 texcoord

: TEXCOORD0;

};

struct v2f //vert 输出数据结构

{

float4 vertex : SV_POSITION;

fixed4 color : COLOR;

float2 texcoord : TEXCOORD0;

};

fixed4 _Color;

v2f vert(appdata_t IN)

{

v2f OUT;

OUT.vertex =

mul(UNITY_MATRIX_MVP, IN.vertex);

OUT.texcoord = IN.texcoord;

OUT.color = IN.color * _Color;

#ifdef PIXELSNAP_ON

OUT.vertex = UnityPixelSnap (OUT.vertex);

#endif

return OUT;

}

…… 此处隐藏:2913字,全部文档内容请下载后查看。喜欢就下载吧 ……
Unity3D Shader 入门精进.doc 将本文的Word文档下载到电脑

    精彩图片

    热门精选

    大家正在看

    × 游客快捷下载通道(下载后可以自由复制和排版)

    限时特价:4.9 元/份 原价:20元

    支付方式:

    开通VIP包月会员 特价:19元/月

    注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
    微信:fanwen365 QQ:370150219