# 【十万个为什么】
# 法线与空间存在什么关系?
在三维空间里,所有的向量和坐标点都不能单独存在,必须跟某个坐标空间相关联 比如法线,需要先从模型空间转换到世界空间。
# TEXCOORD0 .... TEXCOORDn 是什么意思?
模型的纹理贴图,后面的n代表了是哪一套,一般来说: TEXCOORD0 代表 UV 坐标, TEXCOORD1 代表法线 normalDir。
# 什么是UV坐标
所有人都知道xy是坐标,这里的uv是指模型上的点对应贴图纹理的坐标。 例如 人脸的 uv坐标需要在3d模型编辑工具里面展开,摊平,然后绘制对应的纹理贴图,使得模型能够正确位置显示正确的颜色。 说人话:小时候都买过四驱车,四驱车会附带一张贴纸,可以贴上四驱车上,那么贴纸的切割线就是uv图。
# float half 和 fixed 一般用于哪里?
- float(32位) 一般用于顶点坐标点
- half(16位)一般用于uv坐标
- fixed(8位) 一般用于颜色
# 3d模型规范里,一平米面积模型通常需要多大的贴图?
一些比较近镜头的或者细节较多的适当拉大(例如脸部),一些比较不重要的适当拉小(例如脚底)。
说人话: 假如我要打印一张1平方米的海报挂在房间里,那么我给商家的图片尺寸,多大的分辨率比较合适,假如我给商家512X512的尺寸图片,那么给到实物后,那么肯定显示细节不够清晰的,假如给商家1024X1024尺寸的图片,那么实物刚刚好品质过关。
经过与美术沟通,得出的规范结论是1平方米的面积对应贴图大小应该为 1024X1024 换算之后,1平方厘米(大约指甲面积)就等于10.24个像素。
# POSITION 和 SV_POSITION 是啥?
POSITION 代表了以对象原点为坐标系的顶点坐标。 SV 是SystemValue的简写,代表的是转换过后的屏幕空间的坐标。
# clip(x) 函数的作用是什么?
在片段着色器,使用 clip(x) 函数可以丢弃像素,使x小于0的像素进行丢弃,比起设置Alpha值为0,可以有更好的性能。
# 如何在Shader里获得屏幕的宽高
在ShaderLab代码里使用 _ScreenParams 参数数组获得屏幕的宽高,其中 x = 宽度, y = 高度, z = 1 + 1.0 / width , w = 1 + 1.0 / height。
# 如何在Shader里获得指定纹理图片的宽高
在定义sampler2D定义变量下面加上 float4 _MainTex_TexelSize; 的定义,即可得到数据,其中 x = 1/width ,y = 1/height , z = width ,w = height。