三维图形学课程笔记,3D建模与游戏开发方向(unity3d,c4d,3dsmax, maya的对比与联系)

举报
小哈里 发表于 2022/09/25 06:27:20 2022/09/25
【摘要】 文章目录 1、三维图形学2、3D建模3、3D游戏 1、三维图形学 三维图形学课程期末复习笔记: ————————————————————————————————————————...

1、三维图形学

三维图形学课程期末复习笔记:

————————————————————————————————————————————————————————————————————————
一、选择题

第2~3章 图形硬件(选择题)
1、几何流水线
模型坐标系->世界坐标系->观察坐标系->规范化坐标系->设备坐标系
坐标表示:三维场景从建模坐标到设备坐标的变换序列
2、软件标准
ISO标准,GKS(第一个官方标准)PHIGS(第2个官方)
OpenGL(SGI):工业界;平台无关。
DirectX (MS):娱乐界;Widows平台。
Postscript (Adobe):印刷业。

第6章 图元实现算法(计算题)
1、直线(2)
数值微分算法DDA,改进的Bresenham算法
2、圆(2)
中点Bresenham画圆法(不会啊)、椭圆中点画法(怎么判断上下部分)
3、多边形(1)
扫描线算法
4、走样的概念
走样的本质是,离散量表示的连续量的失真
走样是不可避免的
反走样的简单方法是提高分辨率(过取样,区域取样是什么?)

第7-10章 二维&三维 观察&几何变换(计算题)
1、二维变换
平移,旋转,缩放
基于齐次坐标的变换:全部统一为矩阵运算(7-P38)
齐次坐标表示就是用n+1维向量表示一个n维向量(所以不是一一对应的),P(4,3)->P(4,3,1)
二维复合变换:先平移后旋转
2、二维观察流水线
Cohen-Sutherland裁剪算法
3、三维坐标轴旋转
绕什么轴什么轴不变 9-P12
4、相对于任一参考点的缩放
先平移后缩放,再平移回去。
5、三维建模-观察变换流水线(要考 10-P4)
!!!!!
6、三维投影(差别,选择题)
平行投影:易于排列或测量空间物体(三视图)
透视投影:更真实(近大远小)

第14章 样条表示(选择题?计算题?)
1、造型技术
包括 ➢样条的表示 ➢规则形体的表示 ➢非规则形体的表示
2、插值和逼近样条
当选取的多项式使得曲线通过每个控制点,则所得曲线称为这组控制点的插值样条曲线。
当选取的多项式使部分或全部控制点都不在生成的曲线上,所得曲线称为这组控制点的逼近样条曲线。
3、凸壳概念
凸壳是包含一组控制点的凸多边形边界
样条以凸壳为界,这样就保证了对象形态平滑地而不是不稳定地摆动着沿控制点前进。凸壳也给出了所设计曲线或曲面的坐标范围,因而它在裁剪和观察程序中十分有用。
4、逼近样条
对于逼近样条,连接控制点序列的折线通常会显示出来,以提醒设计者控制点的顺序。
这一组连接线段通常称为曲线的控制图,还可以称为“控制多边形”或“特征多边形”。控制图有时就是一条折线。
5、参数连续性条件
0阶: x,y,z值相等
1阶: 斜率切线相同,曲线方程有相同的一阶导数
2阶: 平滑曲线曲线方程有相同的一阶,二阶导数
6、参数连续性&几何连续性
对于几何连续性,曲线将向具有较大切向量的部分弯曲。
7、样条描述方法——曲线描述
给定多项式的阶和控制点位置后,给出一条具体的样条表达式有三个等价方法:
① 列出一组加在样条上的边界条件
② 列出描述样条特征的行列式
③ 列出一组混合函数或基函数
确定如何组合指定的曲线几何约束,以计算曲线路径上的位置。
8、Bezier样条曲线和曲面(计算题?)
三次Bezier贝塞尔曲线,不断逼近线框(特征多边形),端点称为(控制点)。
题:给出P1,P2,P3,P4, 构造一条贝塞尔曲线,参数为0,1/3,2/3,1

第15章 其他三维对象表示
1、实体模型的三类表示
边界表示:曲面分隔内部外部,包括多边形表面模型和扫描表示2种。
构造实体几何表示: CSG树,光线投射算法
空间分割表示: 空间位置没局表示,BSP树,八叉树
2、多边形表面模型
几何阶段->光栅化阶段,只有顶点着色器和片元着色器可编程 15-P20
3、粒子系统
渲染过程:公告板技术
粒子始终面向摄像机方向,需要用到公告板(Billboards )技术。
公告板技术,形象的来说,就好像一个人举着牌子,无论你从哪个方向看向牌子,那个人都会把牌子朝着你的方向旋转,你永远只能看到牌子的正面。
如3D游戏中的血条和NPC上的名字(Non-Player Character不受玩家操纵的游戏角色)。

第17章 光照模型(简答题)
1、Phong模型
真实感图形学中提出的第一个有影响的光照明模型。它是一个经验模型。
2、光照计算发生在哪个阶段?
光照计算发生在顶点操作阶段,他在变换每个顶点的时候,会同时计算一下每个顶点的光照。
在固定流水线中,光照计算默认发生在顶点处理阶段。为了效率!
3、Gouraud 明暗处理?(简答题)
又称为强度插值表面绘制,通过在照明对象的表面上将光强度值进行线性插值来绘制多边形表面
①确定每个多边形顶点处的平均单位法向量;
②对于每个顶点根据光照模型来计算其光强度;
③在多边形投影区域对顶点强度进行双线性插值。
这种插值计算发生在什么时候? 在“光栅化”过程中,会对多边形进行扫描转换,此时正好就可在扫描转换过程中对每个片元进行双线性插值。
4、Phong明暗处理?(简答题)
又称为法向量插值绘制,对法向量进行插值来取代对强度插值。强度值的更精确计算、更真实的表面高光显示及更少的马赫带效应。
①确定每个多边形顶点处的平均单位法向量;
②在多边形投影区域上对顶点法向量进行线性插值;
③根据光照模型,使用插值的法向量,沿每条扫描线计算投影像素的光强度。

第18章 纹理与表面细节
1、几何纹理:基于物体表面的微观几何形状
• 凹凸纹理映射(Bump mapping)
• 移位纹理映射(Displacement mapping)
2、二维纹理映射的主要思想?
将一给定的纹理函数映射到物体表面上,在对物体表面进行光亮度计算时可采用相应的纹理函数值来影3、响光照模型中的参数
二维纹理映射都可采用纹理贴图进行改变

第21章 全局光照
1、全局 = 直接间接
2、光线追踪
结束的条件(逃离到一定节点,超出最大递归深度。或者光线与光源相交)
基本思想:从视点向成像平面的像素发射光线,找到该光线相交的最近物体的交点。
如果该点表面是漫反射,则直接照射产生颜色,如果是镜面反射,则折射跟踪另一条光线。
3、表面绘制

补充-片元操作
1、深度缓存
在投影时,每个投影点的深度也会被记录下来,写入深度缓存。
记录的不是每个顶点的深度,在光栅化时,每个片元的深度会计算出来,写入深度缓存。
用于消隐。(增加真实感)
2、Z-buffer 算法
计算题??
3、片元操作顺序(考试)
片元在写入帧缓存之前要按顺序经历一系列的测试;在写入帧缓存时也会经历一些运算。
写入帧缓存前的测试
裁剪测试
alpha测试
模板测试
深度测试

————————————————————————————————————————————————————————————————————————
二、简答题

1、说明OpenGL基础库,实用库,实用函数工具包之间的差别
核心库:gl开头,包含了最基本的3D函数。
实用库:glu开头,43个函数,glu是对gl的部分封装,包括纹理映射、坐标变换、多边形分化等。
函数库:实用工具库(glut)。有基本窗口界面,独立于gl和glu,是一个跨平台工具库。

第17章 光照模型(简答题)
1、Phong模型
真实感图形学中提出的第一个有影响的光照明模型。它是一个经验模型。
2、光照计算发生在哪个阶段?
光照计算发生在顶点操作阶段,他在变换每个顶点的时候,会同时计算一下每个顶点的光照。
在固定流水线中,光照计算默认发生在顶点处理阶段。为了效率!
3、Gouraud 明暗处理?(简答题)
又称为强度插值表面绘制,通过在照明对象的表面上将光强度值进行线性插值来绘制多边形表面
①确定每个多边形顶点处的平均单位法向量;
②对于每个顶点根据光照模型来计算其光强度;
③在多边形投影区域对顶点强度进行双线性插值。
这种插值计算发生在什么时候? 在“光栅化”过程中,会对多边形进行扫描转换,此时正好就可在扫描转换过程中对每个片元进行双线性插值。
4、Phong明暗处理?(简答题)
又称为法向量插值绘制,对法向量进行插值来取代对强度插值。强度值的更精确计算、更真实的表面高光显示及更少的马赫带效应。
①确定每个多边形顶点处的平均单位法向量;
②在多边形投影区域上对顶点法向量进行线性插值;
③根据光照模型,使用插值的法向量,沿每条扫描线计算投影像素的光强度。

————————————————————————————————————————————————————————————————————————
三、计算题【重点】
二维变换
DDA
Bresenham
扫描线

1、某图形系统分辨率1024*768, 24位真彩色,计算帧缓存最小为?
1024*768*log_2{颜色总数2^24}/8 = 2.25MB

2、二维图形变换 & 规范化齐次坐标 (二维矩阵变换)(必考)
题:三角形ABC,绕点C逆时针转45度,写出变换矩阵和变换后图形的规范其次坐标。
+ 其次坐标就是,n维到n+1维,写出坐标,后面加个1,((Ax,Ay,1)(Bx,By,1)(Cx,Cy,1))
+ 变换矩阵T, 逆时针转 = T1*T2*T3(先移到原点)
平移变换矩阵 = (100,010,xy1)
旋转变换矩阵 = ((cos,sin,0)(sin,cos,0)(0,0,1)),逆时针θ,顺时针-θ。

3、直线算法(2个)
数值微分算法DDA画直线(必考)
题:给出两点,计算出每个点的增量。
k=△y/△x, x+=1, y+=k
表格:(x, y, int(y+0.5))

中点Bresenham(必考)
题:给出直线两个端点P1,P2,用Bresenham得到最佳逼近的像素点集,要5个点。
表格:(x,y,e,e+2△y) e=-△x, 
x=0,y=0,e=-8 , e1=2 (如果e>0, e=e-2△x, y=y+1)
x=1,y=1,e=e1-2△x, e1=e+2△y


4、曲线算法-三次Bezier贝塞尔曲线(1个)(可能不考)
不断逼近线框(特征多边形),端点称为(控制点)。
题:给出P1,P2,P3,P4, 构造一条贝塞尔曲线,参数为0,1/3,2/3,1
公式:P(t)=(1-t)^3P1+3t(1-t)^2P2+3t^2(1-t)P3+t^3P4
然后用4个t代入参数算出P(t)关于P1~4的四个式子,然后代入点的坐标。

5、画圆法-中点Bresenham画圆法(据说不考)
???


6、填充算法(2个)(必考)
填充算法-扫描线填充 & ET表和AET表
题:多边形,采用扫描线填充,写出ET表和Y=6时的AET表
+ ET表,交点左边的线再到右边的线
(当前交点x坐标,当前边的斜率倒数1/k<垂直就0>,当前边最大的ymax, )
1—>(5, -3, 2, 空)->(5,3,3, 空)
ET表只扫顶点
2->(2, 0, 7, 空)->(扫过了不用写)
3->(11, 0, 8, 空)
4(没有顶点就无视)
5->(5,-1.5,7, 空)->(5,2,8,空)
6, 7, 8两个顶点就不用看了,边扫完就行
+ AET表(每条扫描线都要扫)
6->(2, 0, 7, 空)->(3.5,-1.5,7, 空)->(7, 2, 8, 空)->(11, 0, 8, 空)

填充算法-种子填充(栈一定是14步)(据说不考)
题:要求画出出栈顺序和填充过程。
从S开始,每次当前出栈,然后"左上右下"入栈。
从出栈的元素位置开始,重复"左上右下"入栈。


7、裁剪算法(1个)(据说不考)
Cohen-sutherland
+ 给图像窗口的9个区域编码,"上下右左"依次1或0(在里面就是1)。
+ 题:给出xmin,xmax,ymin,ymax, 以及两条直线,求编码过程和裁剪过程。
+ 若A=0且B=0,都在里面,保留。若A!=0且B!=0且A&B!=0,都在外面扔掉。否则有交点,再次重新处理窗口内部的新直线。
A点0110,B点1010, A&B=0010!=0,所以舍弃。


8、消隐算法(1个) - 真实感(据说不考)
Z-buffer画家算法
+ 深度数组(存顶点深度),帧缓存区
(深度排序,光线追踪)

最后推荐几个复习资料:
https://www.bilibili.com/video/BV1NX4y1A7ZM
https://www.bilibili.com/video/BV1hr4y147Ki
https://www.bilibili.com/video/BV1Jr4y1U7zy

  
 
  • 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
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237

2、3D建模

著名建模软件对比:

  • C4D 、Maya 和3DMax都是三维软件,但区别在于各自的主要应用领域不同
  • 3DS max属于元老级别的软件,从02年左右就霸占市场。主要在建筑、机械领域比较强,因为这些行业需要用CAD作平面图,两者属于同一家公司,适配性比较好。
    Max综合能力强大,支持各种插件、文件及游戏程序接口等等,兼容性非常高。
  • Maya大概是在07年左右开始兴起,功夫熊猫、玩具总动员这种国外三维动画特效的制作会用到,但是MAYA的学习难度非常高
  • C4D一般用于影视后期,三维电商海报设计,平面设计,UI设计等。在这个方面有很多模块比3dmax,maya强,也方便很多。并且类似ps的图层式操作,学习起来也简单很多。
    C4D以高效的运算速度和强大的渲染插件在行业内著称。
  • 总体起来说,Maya太难不考虑,C4D运动图形好用,3DMAX的功能更加完善。C4D上手快,3DMAX因为常年的更新增加功能,学起来的确需要的时间多一点。

建模知识学习:

  • 三维建模在现实中非常常见,如孩子们堆沙丘城堡、搭积木的过程是三维建模的过程。
    人脑中的物体形貌在真实空间再现出来的过程,就是三维建模的过程。
    实验要求:
    
    实验1:二维图形建模
    掌握绘制二维图形,二维图形编辑的方法。
    知道如何使用Edit Spline(编辑样条曲线)命令对二维物体进行编辑,
    以及如何使用Lathe、Bevel、Extrude命令将二维图形转换为三维物体。
    
    实验2:多边形建模
    了解各种基本几何体类型;
    掌握几何体的创建方法以及创建复杂几何体的方法;
    掌握多边形建模的基本方法及操作;
    知道多边形建模与其他典型建模方法的区别;
    掌握低精度模型的建模方法。
    
    实验3:典型建模方法
    掌握使用布尔运算创建对象的方法,使用放样建模创建对象的方法;
    理解面片建模、NURBS建模等曲面建模的基本原理;
    掌握面片建模的方法及应用的场合;
    了解NURBS建模的基本方法;
    能分析出建模过程中存在的问题并给出解决方案。
    
    实验4:材质与贴图
    了解各种材质参数的含义及通道;
    掌握常用材质的制作方法及常用贴图的使用方法;
    能用合适的通道为模型设置合适的材质贴图;
    重点掌握UVW展开及贴图;
    知道如何处理贴图过程中出现的各种问题。
    
    实验5:灯光与摄像机
    掌握标准灯光的基本打法;
    熟悉光度学灯光的打法及应用的场合;
    掌握不同场合应用哪类灯光及参数的调整;
    理解三维空间中摄像机的基本原理;
    掌握摄影机的创建方法和使用方法;
    知道摄像机动画的设置方法。
    
    
        
       
    • 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

教育版地址:

  • Autodesk(CAD,3dmax,Maya)
    https://www.autodesk.com.cn/education/edu-software/overview,每年可以申请一次
  • Maxon(Cinema 4D)
    教育版:https://www.maxon.net/zh/educational-licenses, 20/半年,限1次

建模软件学习:

  • 资料:
    https://www.bilibili.com/video/BV1nT4y1e7hf
    https://www.bilibili.com/video/BV1ur4y1T72V
    https://www.bilibili.com/video/BV177411P7d1
    
        
       
    • 1
    • 2
    • 3

其他一些软件:

  • KeyShot是一款独立的渲染器,不像Cinema 4D那样,整合建模与渲染。
    这使他可以承载其他软件的数据进行作业,配合犀牛和proe等3D建模软件使用。
    keyshot是工业设计公司的主流渲染器。
  • SketchUp草图大师,是一套面向建筑师、城市规划专家以及相关专业人员的3D建模程序。与其他3d软件不同的是,sketchup创建模型的方式是**“画”出来的**,十分的简单方便,简单的学习之后都可以上手它的应用。sketch up模型是也可以导入到C4D渲染。

3、3D游戏

Unity3D是什么

  • Unity3d是一个开发游戏,主要用于手机游戏开发的引擎。什么是引擎,引擎就是工具的意思。
  • Unity3d的编程语言用的是C#和JavaScript,但是大多情况是用的C#
  • Unity3d可以用于手机3d游戏开发(王者荣耀),移动端VR设备(手机VR眼镜),AR(元宇宙),动画游戏制作(动画电影)等方向。

Unity3d学习的内容

  • 角色控制(角色移动,镜头跟踪,碰撞效果, 角色互动)
  • 游戏UI(玩法设计,游戏界面,计分器,游戏结束,胜利关卡)
    在这里插入图片描述

Unity3D软件安装

  • VS2022+unity3D开发环境搭建
    https://gwj1314.blog.csdn.net/article/details/124652720
  • 教育版地址,每年可以申请一次
    https://unity.com/cn/products/unity-student

部分Unity Shade程序题复习

void init(){
	GL float light position[] = {0,0,50,1};
	GL float am_color[] = {1,1,1,1};
	GL float df_color[] = {1,1,1,1};
	GL float sp_color[] = {1,1,1,1};
	glLightfy(GL_LIGHT1, GL_POSITION, light1_position);
	glLightfy(GL_LIGHT1, GL_POSITION, am_color);
	glLightfy(GL_LIGHT1, GL_POSITION, df_color);
}


实验1-一个简单的顶点/片元着色器(顶点输出给片元)
球体Object+材质Material+颜色(着色器shade)

实验2-基础光照
1.	编程实现 逐顶点漫反射光照
2.	编程实现 逐像素漫反射光照
4.	编程实现 逐顶点高光反射光照
5.	编程实现 逐像素高光反射光照
3.	(选做)编程实现Half-Lambert光照
6.	(选做)编程实现Blinn-Phong光照

实验3-基础纹理
1.	编程实现单张纹理
2.	编程凹凸纹理(切线空间下计算和世界空间下计算两种方式)
3.	(选做)编程实现渐变纹理
4.	(选做)编程实现遮罩纹理

实验4-透明效果
1.	编程实现透明度测试效果
2.	编程实现关闭深度写入的半透明效果
3.	编程实现开启深度写入的半透明效果
4.	(选做)编程实现透明度测试的双面渲染
5.	(选做)编程实现透明度混合的双面渲染


    
//--------------------------------------Part1.着色器----------------------------------------------

//shader,输入顶点着色器数据,输出片元着色器数据
//结构:Shader->Properties+SubShader->Pass
//数据:CGPROGRAM, #pragma, a2v&v2f,  
//顶点&片元着色器:v2f vert(a2v v) ;  fixed4 frag(v2f i) : SV_Target

//application - > vert -> fff -> pingmu
CGPROGRAM
#pragma vertex vert
#pragma fragment frag

//定义顶点着色器的输入结构体
//a(application) to v(vertex shader), 数据:应用程序阶段->顶点着色器
struct a2v{
    float4 vertex : POSITION;    //vertex变量 : 模型空间的顶点坐标
    float3 normal : NORMAL;      //normal变量 : 模型空间的法线方向
    float4 texcoord : TEXCOORD0; //用模型的第一套纹理坐标填充texcoord变量
};

//定义顶点着色器的输出结构体(也是片元着色器的输入结构体)
//v2f 用于在顶点着色器和片元着色器之间传递信息
struct v2f {
    float4 pos : SV_POSITION; // pos  : 顶点在裁剪空间中的位置信息(SV_POSITION)
    fixed3 color : COLOR;     // color: 为了把顶点着色器中计算得到的光照颜色传递给片元着色器
}


// 将顶点坐标从模型空间转换到裁剪空间
v2f vert(a2v v) {
    v2f o;
    o.pos = UnityObjectToClipPos(v.vertex);
    o.color = v.normal * 0.5 + fixed3(0.5,0.5,0.5); // normal范围为-1~1,调整至0~1(不同平面不同颜色)
    return o;
}


// 将插值后的i.color显示到屏幕上
fixed4 frag(v2f i) : SV_Target{
    return fixed4(i.color, 1.0);
}


//--------------------------------------Part2.反射----------------------------------------------
//PASS

//高光设置(只有高光有)
Properties {
    _Diffuse ("Diffuse", Color) = (1, 1, 1, 1)  //漫反射只有这个
    _Specular ("Specular", Color) = (1, 1, 1, 1)//控制材质的高光反射-颜色
    _Gloss ("Gloss", Range(8.0, 256)) = 20      //控制高光区域的-大小
}

//定义lightmode得到一些unity的内置光照变量 (反射都要)
Tags { "LightMode"="ForwardBase" }
#include "Lighting.cginc"

//定义和properties中属性类型相匹配的变量
fixed4 _Diffuse;
fixed4 _Specular;//值的范围在0和1之间,只需用fixed精度定义
float _Gloss;    //范围很大,所以用float精度来存储


//顶点着色器-----v2f
//灯光都要的吧
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;//漫反射&环境光部分
fixed3 worldNormal = normalize(mul(v.normal, (float3x3)_World2Object));//得到法线方向
fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);            //得到光源的方向

//逐顶点部分
//高光(镜面反射)部分
fixed3 reflectDir = normalize(reflect(-worldLightDir, worldNormal));//计算入射光线方向关于表面法线的反射方向reflectDir
fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - mul(_Object2World, v.vertex).xyz);//计算视角方向
//漫反射光照
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);//顶点位置从模型空间转换到裁剪空间中
fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(worldNormal, worldLight));//根据公式计算
o.color = ambient + diffuse;

//逐像素------frag片元着色器
//高光(镜面反射)部分
fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(worldNormal, worldLightDir));				
fixed3 color = ambient + diffuse;
return fixed4(color, 1.0);



//--------------------------------------Part3.纹理(切线空间)----------------------------------------------

Properties {
    _Color ("Color Tint", Color) = (1, 1, 1, 1)
    _MainTex ("Main Tex", 2D) = "white" {}      //声明纹理
    _Specular ("Specular", Color) = (1, 1, 1, 1)//控制材质的高光反射颜色
    _Gloss ("Gloss", Range(8.0, 256)) = 20      //控制高光区域的大小
    _BumpMap ("Normal Map", 2D) = "bump" {}     //bump是unity内置的法线纹理
    _BumpScale ("Bump Scale", Float) = 1.0      //控制凹凸程度
}

struct v2f {
    float4 pos : SV_POSITION;
    float4 uv : TEXCOORD0;     //xy分量存储_MainTex的纹理,zw分量存储_BumpMap的纹理
    float3 lightDir: TEXCOORD1;//存储变换后的光照方向
    float3 viewDir : TEXCOORD2;//存储变换后的视角方向
    float4 texcoord : TEXCOORD0;//将模型的第一组纹理坐标存储到该变量中
};

struct v2f {
    float4 pos : SV_POSITION;
    float3 worldNormal : TEXCOORD0;
    float3 worldPos : TEXCOORD1;
    float2 uv : TEXCOORD2;//用于存储纹理坐标的变量,以便在片元着色器中使用该坐标进行纹理采样
};

TANGENT_SPACE_ROTATION;//得到从模型空间到切线空间的排列矩阵rotation
//使用ObjSpaceLightDir得到模型空间下的光照方向,再用变换矩阵rotation把它们从模型空间变换到切线空间中
o.lightDir = mul(rotation, ObjSpaceLightDir(v.vertex)).xyz;
//使用ObjSpaceViewDir得到模型空间下的视角方向,再用变换矩阵rotation把它们从模型空间变换到切线空间中
o.viewDir = mul(rotation, ObjSpaceViewDir(v.vertex)).xyz;

fixed4 packedNormal = tex2D(_BumpMap, i.uv.zw);//利用tex2D对法线纹理_BumpMap进行采样
tangentNormal = UnpackNormal(packedNormal);//UnpackNormal得到正确的法线方向



//--------------------------------------Part4.半透明度----------------------------------------------


Properties {
    _Color ("Color Tint", Color) = (1, 1, 1, 1) 
    _MainTex ("Main Tex", 2D) = "white" {}      //控制纹理
    _AlphaScale ("Alpha Scale", Range(0, 1)) = 1//在透明纹理的基础上控制整体的透明度
}

Pass {
    ZWrite On
    ColorMask 0//设置颜色通道的写掩码,为0该Pass不写入任何颜色通道
}

o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);//内置宏实现上一句的计算
clip (texColor.a - _Cutoff);//判断参数是否小于0,如果是就丢弃这个片元

return fixed4(ambient + diffuse, texColor.a * _AlphaScale);//纹理像素的透明通道和材质参数的alphascale相乘

  
 
  • 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
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178

文章来源: gwj1314.blog.csdn.net,作者:小哈里,版权归原作者所有,如需转载,请联系作者。

原文链接:gwj1314.blog.csdn.net/article/details/126935053

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200