- 本篇博客主要为个人学习所编写读书笔记,不用于任何商业用途,以及不允许任何人以任何形式进行转载。
- 本篇博客会补充一些扩展内容(例如其他博客链接)。
- 本篇博客还会提供一些边读边做的效果截图。文章内所有数学公式都由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 |
|
- 第一个代码
- 关于’:’语法,可以理解为一种限制,或条件。例如: 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
游戏内物体(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 |
|
你别说还蛮好看的
- 属性设置:设置一个颜色的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 |
|
- ShaderLab属性类型和CG变量类型的匹配关系
ShaderLab属性类型 | CG变量类型 |
Color,Vector | float4,half4,fixed4 |
Range,Float | float,half,fixed |
2D | sampler2D |
Cube | samplerCube |
3D | sampler3D |
- 数值类型:精度范围在不同平台可能会略有不同
类型 | 精度 |
float | 32位 |
half | 16位,范围:+-60 000 |
fixed | 11位,范围:+-2.0 |
- 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