《Unity Shader入门精要》笔记:初级篇(1)

  • 本篇博客主要为个人学习所编写读书笔记,不用于任何商业用途,以及不允许任何人以任何形式进行转载。
  • 本篇博客会补充一些扩展内容(例如其他博客链接)
  • 本篇博客还会提供一些边读边做的效果截图。文章内所有数学公式都由Latex在线编辑器生成。
  • 本篇博客主要提供一个“glance”,知识点的总结。如有需要请到书店购买正版。
  • 博客提及所有官方文档基于2022.2版本,博客会更新一些书中的旧的知识点到2022.2版本。
  • 如有不对之处欢迎指正。
  • 个人博客网址:《Unity Shader入门精要》笔记:初级篇(1) - Sugar的博客,如文章转载中出现例如传送门失效等纰漏,建议直接访问原博客网址。

  • 我创建了一个游戏制作交流群:637959304 进群密码:(CSGO的拆包密码)欢迎各位大佬一起学习交流,不限于任何平台(U3D、UE、COCO2dx、GamesMaker等),以及欢迎编程,美术,音乐等游戏相关的任何人员一起进群学习交流。

 

  • 初级篇内容主要讲述关于基础的光照模型、纹理和透视等的初级渲染效果。(这部分也可以同时阅读我的HLSL博客内容进行学习)

UnityShader入门

  • 最简单的顶点/片元着色器:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

Shader "name"

{

        Properties

        {

                //属性

        }

        SubShader

        {

                Pass

                {

                        //设置渲染状态和标签

                        //开始CG代码片段

                        CGPROGRAM

                        //编译指令

                        #pragma vertex vert

                        #pragma fragment frag

                        //CG代码

                        ENDCG

                        //其他设置

                }

                //其他pass

        }

        //其他的SubShader

        //如果SubShader都失败了

        Fallback “VertexLit”

}

  • 第一个代码
  • 关于’:’语法,可以理解为一种限制,或条件。例如: SV_POSITION是限制函数只能输出裁剪空间的坐标,也可以换一种角度理解,限制->通知,告知Unity要输出的是裁剪空间坐标。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

shader "Example/Shader01"

{

        SubShader

        {

                Pass

                {

//CG代码片段

                        CGPROGRAM

//告诉Unity哪个函数包含了顶点着色器代码,哪个函数包含片元着色器代码

                        #pragma vertex vert

                        #pragma fragment frag

//POSITION把顶点坐标填入到V中,SV_POSITION顶点着色器输出的是裁剪空间中的坐标

                        float4 vert(float 4 v : POSITION) : SV_POSITION

                        {

                                return mul (UNITY_MATRIX_MVP,v);

                         

                        }

                        fixed4 frag() : SV_Target

                        {

                                return fixed4(1.0,1.0,1.0,1.0);

                        }

                        ENDCG

                }

        }

 }

材质,Shader

游戏内物体(CUBE)

效果

  • 活学活用: return fixed4(1.0,1.0,0.5,1.0);时的效果。有时候要刷新一下材质才能显示出效果。

  • 注意有一条语句语法进行了更新:Upgrade NOTE: replaced ‘mul(UNITY_MATRIX_MVP,*)’ with ‘UnityObjectToClipPos(*)’
  • 我们利用结构体来存储模型的法线,纹理坐标等信息。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

Pass

{

        CGPROGRAM

        #pragma vertex vert

        #pragma fragment frag

//输入结构体

        struct a2v

        {

                float4 vertex : POSITION;

                float3 normal : NORMAL;

                float4 texcoord : TEXCOORD0;

        };

//输出结构体

        struct v2f

        {

//裁剪信息

                float4 pos : SV_POSITION;

//颜色信息

                fixed3 color : COLOR0;

        };

        v2f vert(a2v v)

        {

                v2f o;

                o.pos = UnityObjectToClipPos(v.vertex.xyz);

//根据法线向量v.normal来改变颜色

                o.color = v.normal * 0.5 + fixed3(0.5,0.5,0.5);

                 return o;

        }

        fixed4 frag(v2f i) : SV_Target

        {

                return fixed4(i.color,1.0);

                }

        ENDCG

}

你别说还蛮好看的

  • 属性设置:设置一个颜色的properties让用户自定义颜色。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

shader "Example/Shader01"

{

//自定义用户面板

    Properties

    {

        _Color ("Color Tint",Color) = (1.0,1.0,1.0,1.0)

    }

    SubShader

    {

        Pass

        {

            CGPROGRAM

            #pragma vertex vert

            #pragma fragment frag

            fixed4 _Color;

            struct a2v

            {

                float4 vertex : POSITION;

                float3 normal : NORMAL;

                float4 texcoord : TEXCOORD0;

            };

            struct v2f

            {

                float4 pos : SV_POSITION;

                fixed3 color : COLOR0;

            };

            v2f vert(a2v v)

            {

                v2f o;

                o.pos = UnityObjectToClipPos(v.vertex.xyz);

                o.color = v.normal * 0.5 + fixed3(0.5,0.5,0.5);

                return o;

            }

            fixed4 frag(v2f i) : SV_Target

            {

                fixed3 c = i.color;

//让用户面板中的颜色来决定顶点输出的颜色

                c *= _Color.rgb;

                return fixed4(c,1.0);

            }

            ENDCG

        }

    }

}

  • ShaderLab属性类型和CG变量类型的匹配关系
ShaderLab属性类型CG变量类型
Color,Vectorfloat4,half4,fixed4
Range,Floatfloat,half,fixed
2Dsampler2D
CubesamplerCube
3Dsampler3D
  • 数值类型:精度范围在不同平台可能会略有不同
类型精度
float32位
half16位,范围:+-60 000
fixed11位,范围:+-2.0
  • Unity内置文件和变量传送门,UnityShader提供了一些内置文件(具体见官方手册),可以不适用include进行头文件包含,Unity会自动加安策处理。
  • 内置着色器变量:传送门

  • CG/HLSL语义:语义可以让Shader知道从哪里读取数据(例如:COLOR0)。即使语义相同,位置不同表达的意思也会不同。DirectX10以后新的语义类型:系统数值语义(system-value semantics),以SV为开头,代表系统数值。有些时候(例如POSITION和SV_POSITION)语义可以不加SV开头,但如果考虑跨平台的工程,那么最好在能加SV的地方把SV加上去。
  • 从应用阶段传递模型数据给顶点着色器时的常用语义:
语义描述
POSITION模型空间顶点位置,float4
NORAML顶点法线,float3
TANGENT顶点切线,float4
TEXCOORD0-7寄存器类似于,存放坐标等。float2或float4
COLOR顶点颜色,fixed4或float4

  • 从顶点着色器传递数据给片元着色器时的常用语义:
语义描述
SV_POSITION裁剪空间中的顶点坐标,必要语义
COLOR0、COLOR1通常用于输出第一、二组顶点颜色
TEXCOORD0-7通常用语输出纹理坐标
  • 片元着色器输出时的常用语义
语义描述
SV_Target输出值存储到渲染目标中,等同于DirectX9中的COLOR
  • 调试:Unity中自带UnityShader的调试,在Windows->Analysis->Frame Debugger中(与书中当时的位置稍有不同)。如果想要看到更多的信息,可以在VS等IDE中寻找相关插件。


  • 额外补充-代码数学规范:
    1、规范化语法
    2、避免不必要的计算
    3、慎用分支和循环语句(因为开销大)
    4、不要除以0
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值