文章目录
- 前言
- 一、UV
-
- 1.uv
- 2.案例:扭曲着色器
- 二、三个向量
- 三、*各种空间
- 四、其他常见节点
-
- 1、min max clamp saturate
- 2、length distance
- 3、ceil floor round
- 4、*ddx ddy
- 5、 sine cosine
- 6、power
- 7、smoothstep
- 五、混合法线贴图
- 六、细节法线着色器
-
- 1、普通的
- 2、高级的
- 总结
前言
这门课比我想象的要快得多。
一、UV
1.uv
uv是纹理坐标,将三维模型的皮肤扩展到二维平面。 我也很熟悉这一块,内容不多。
2.案例:扭曲着色器
做法线我没有噪音云的图,干脆直接拿ben的用来讲解好了
二、三个向量
三个向量如下:
- 表面法线,存储在模型每个顶点的向量,单位长度,通常由建模软件自动生成
- 相机矢量是从相机位置指向每个渲染点的向量。当我们开始观察它时,它被渲染成从每个点到相机之间的距离。当它与表面法线相结合时,可以得到面向相机的哪些部分和背向相机。为了便于计算,我们通常将相机矢量集成
- 光向量,定向光,光向量是常值;点光源,从光源的位置到当前渲染点。同样,光强也可以根据表面法线的夹角来计算。
在UE可以选择世界顶点法线
- 需要注意的是,在同一空间坐标系下,比较使用的两条法线应该是相同的
- 在ue里面, CameraVector已归一化,顶点法线也归一化
很酷的案例:
随着摄像机拉近拉远,可以做出不同的效果
一些ue和unity的不同:
- uez轴向上,unityy轴朝上,注意这个动作需要改变
- ue和unity的Camera Vector方向相反,unity需要先翻转,然后点击等等
三、*各种空间
绿色:y轴 蓝色:z轴 红色:x轴
四个空间:世界空间(以世界坐标系原点为中心)、物体空间(以物体为中心)、相机空间(以相机为中心)、切线空间(相对于纹理表面布局) 如果我觉得要做风格化,相机空间相当好用。 我理解坐标系的转换是坐标系原点的移动。例如,将世界顶点坐标移动到相机坐标下,实际上是用相机坐标系的原点来识别所有的点。 (以上理解有问题) 一个案例:
- 通过将切线空间调整到世界空间/物体空间,可以实现更好材料之间的混合。需要注意的是,在世界空间中,苔藓会随着模型的移动而移动,而物体空间不会移动
然而,我真的很关心切线空间转移到世界空间的过程。为什么转移的空间与原来的世界空间不同?所以我又去找信息了。 我认为这应该是原因:原来的世界坐标不会考虑实际模型中法线的变化。例如,如果我的模型是一个球,他只处理球上的法线,而实际的材料法线没有被考虑在内,那些从法线地图转移出来的人应该有这个元素。(这篇文章涉及到很多矩阵公式。当我巩固这个基础课程时,试着重现它shader)
四、其他常见节点
1、min max clamp saturate
首先,这些节点用于限制数据范围 请注意,这实际上是一种特殊的映射,但不是一个接一个的映射。他实际上用限定值取代了所有不在范围内的值(例如max(x,0.5),一切小于0.5x将被0取代.5)
2、length distance
- length接受一个向量或一条线,给出长度
- distance接受两点,给出距离 栗子:basic版)
- 指向y方向(-00.5)距离(因为原点在中心,轴线应该移动到底部)sine 时间相乘,获得一个偏移量,加到原来的坐标上即完成
3、ceil floor round
四舍五入round,高斯取整floor,向上取整ceil
4、*ddx ddy
介两用于寻找斜率。 一般来说,我们至少需要两点来支持斜率。 但是ddxddy利用图形芯片的特殊功能,可以用单点获得斜率。渲染像素四组,ddx单像素右侧的数据,ddy单个像素正上方的数据可以获得
*几个例子
-
获得世界坐标系下的坐标,获得水平斜率和垂直斜率,做叉积,获得法向量,并将坐标系转换为切向空间
-
效果就像反射一样,主要取决于Reflection 节点
反射向量输出是表面法线反射到相机的方向
LongLat 图,又称经纬度图,是常见的hdr应该都是贴图Longlat图
但这样做是有问题的。 他中间会有白色的断裂痕迹 这是因为当纹理包裹模型(我理解是需要首尾连接的时候),边界不连续,采样时会计算mipmap等级,但纹理坐标跨度直接从0到1,在接缝处,纹理采样不知道如何处理mipmap。 但是ue有一个很好的解决方案 纹理坐标上ddx,ddy,模型是连续的,连接后OK
5、 sine cosine
没什么好说的。没有这个么的离不开这个. 几个例子:
- 创造涟漪: 我觉得这个比较屌的是用了一些物理正弦波的知识,属于比较特殊的案例,可以稍微记一下。
6、power
ue:Base基数,Exp指数 unity:A基数,B指数 我认为这是中国人应该有的数学基础(思考)
如果你的颜色图片没有伽马矫正(即没有勾选)srgb选项),采样后的图片可以指数为2.2的计算。 伽马矫正的图片也可以指数为0.将45的计算转换为线性
丢个链接:ben给的gamma矫正文章
7、smoothstep
实际使用的数学公式如上(看q的两个ok) 给定最大最小值,实现两者之间的平滑过渡:
- 举个栗子,min = 0.5,max = 0.8,当值小于0.5时为0,大于0.8时1分,中间部分平滑过渡
有趣的案例:
- 溶解 最大最小值的定义,加上时间的来回变化,最终实现全黑全白的图案来回冲击
五、混合法线贴图
左边是ue的,右边是unity是的。两个法线贴图完全相同,但绿色通道反向
- 垂直向上区域,rgb表示为 (0.5,0.5,1)
- 颜色指向位置
以下是一些混合法线贴图的方法,共四种:
- 先来看看正常的法线贴图:
- 为了方便,这里ben使用相同的贴图
- 第一种混合方法:(直接混合) ben放弃z方向上的重量,最后加1 一些信息丢失了。但胜利在于cheaper,做水波类的时候都是可以用的
- 第二种方法:UDN UDN最开始是由Unreal的工作人员提出的,和直接发相比,他只是替换了z分量为原始的z,所以保留了一部分信息
- 第三种方法:whiteout 由AMD的工作人员提出的,实际上就是把需要混合的两个法线的z分量相乘,保留的信息更多了
- 第四种方法:RNM 比较困难的方法,也比较复杂 又给我们推了一篇文章
unity自带有normalBlend节点,default选项使用的whiteout方法,reordered选项用的是RNM混合 unreal自带的BlendAngleCorrectedNormal节点使用的是RNM混合方法
六、细节法线着色器
1、普通的
就是利用法线混合,给分辨率较低的贴图加一点假细节
一开始用的是2k的贴图: 可以看到,放大了之后就很糙,不够好看
所以我们使用混合来填充假细节
- 他的detail选项里面:RG通道存储的是法线的x和y,B通道是粗糙度,alpha通道是颜色叠加器
- 接下来做的就是混合在一起就ok
加了细节之后长这样: unity版:
2、高级的
我们期望可以混合更多种的法线,比如衣服上的各种纹理。 混合的时候会用到蒙版!!! 以下是一个错误的版本:
- 这个的思想主要就是用蒙版和贴图相乘,然后各个效果相加起来,就可以获得要覆盖的贴图,在和原来的贴图混合起来即可
- 这个问题是没有对材质种类、贴图种类等的增多带来的后果进行油画,shader会越来越臃肿
正确的做法是:贴图矩阵,一堆贴图的组合 在这个地方点击添加
- 他们实际上都是完整的方块,只不过在这里展示的只有一条
- 要注意三通道UVW
接下来是明度控制Mask法
- 首先从黑到白的颜色分成n个象限
- 在ps里选取每个象限中的中间值来绘制mask
- 在ue里导入贴图,并且把mask的明度范围从[0,1]变成[0,n],利用floor估计数值,即取值为不连续的0,1,2…即可利用明度控制Mask
首先在ps里面讲四张贴图合成一张,像这样: 然后更改贴图类型,并且设置行和列 接下来和ue的基本一样
总结
后面的内容不会有这些比较基础的节点了,难度应该会上升(来学东西的管什么难不难咧) 本节没有深挖的部分: