资讯详情

shader着色器基础课08-20

文章目录

  • 前言
  • 一、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的基本一样

总结

后面的内容不会有这些比较基础的节点了,难度应该会上升(来学东西的管什么难不难咧) 本节没有深挖的部分:

标签: uv连接器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台