shader着色器基础课31-40


前言

这一期的内容偏向风格化了。


一、MatCap材质

1、一些ben的内容

MatCap全名叫做Material Capture(材质捕捉),最开始是在Zbrush上应用的。
将光源,材质信息离线烘焙成一张材质球放在贴图上,渲染时候直接拿来用,通过计算将MatCap的纹理信息映射到模型上。

球体贴图是把球面纹理映射到网格上,去模拟反射的效果

这个是我们在第十集的时候做的matcap
在这里插入图片描述

  • 注意法线是在世界空间下的

在这里插入图片描述
但是有个bug在这,当我们看向别处的时候,这里会出现转移的问题

  • 问题的原因是它不会随着摄像机角度的改变而旋转(ben讲的那个视口空间和摄像机空间什么的我记得应该是一种东西,不知道为什么又变成不同的了,是不是翻译问题)

所以我们会使用以下的方式
在这里插入图片描述

满足这两种要求的解决方案是不仅从法线而且从视图方向构造UV坐标。在视图空间中,这个方向非常容易获得。由于照相机位于此空间的原点,因此指向顶点的矢量与其视图空间位置相同。我们只需要对其进行规范化,使其不在纹理中的单位圆之外进行采样。因为我们在混合之后进行归一化,所以我们只需要对两个方向向量求和就可以了。由于矩阵向量积是分布的,我们甚至可以混合对象空间中已经存在的位置和正态,然后仅将混合的向量转换为视图空间。这将使修改后的着色器多出一行。我还添加了一个混合因子()来调整每种材质的视图方向的影响,但在大多数情况下,将其硬编码为0.5可以获得良好的结果。_ViewDirBlend

效果:
在这里插入图片描述

2、关于matcap的一些其他了解

因为ben对于这一块的解释和原理并不多,而matcap确实是比较常用和好用的东西。
所以我自己又去搞了点拓展的看看。

在这里插入图片描述
MatCap 是一种巧妙且不真实的方式,通过将照明设置和材质属性的各个方面编码到单个纹理中来模拟这些交互。

然后我看到了这一篇文章
怎么制作matcap

二、经纬投射(LonglatUV)

LonglatUV,这个之前是做过案例的,配合反射向量那一节食用更香。
推一个我自己常用的poly haven

LonglatUV实际上做的操作:
在这里插入图片描述

三、创建cube maps

cube maps:
在这里插入图片描述
由多张纹理组合而成的纹理
unity制作过程:

  • 首先可以选择在引擎里面用正方形截图,分布截取以下的方向的图片并且按照顺序排列
    在这里插入图片描述
  • 然后可以选择把图片导入unity,导入格式如下所示
    在这里插入图片描述
    • Convolution type(卷积类型)这个是确定mipmap计算方式的,如果是none类型,就是按照我们最常见的mipmap计算,如果是镜面反射,就是使用调整粗糙或者平滑度来调整mipmap,比如说最光滑用的是mipmap 0 等级等等
    • FixedUp Edge ,这个是打开接缝,这代表正方形每条边都会连起来

ue制作过程:
比起unity,ue的是有一些困难在里面的
官方文档

When using the NVIDIA Texture Tools plug-in for Photoshop那个插件网站

在这里插入图片描述
图片要这个样子排

  • 原因是dds和directx都默认了y轴式朝上的,而ue是z轴向上的
  • 导出来的格式一定要是dds(要安装NVDIA那个插件)

在这里插入图片描述
这么设置然后导出,就可以了

四、室内着色器

1、基础方块

*本节内容有点酷的
我们想要利用贴图让一个立方体看起来像是里面有内容。

  • 第一步:把uv原点移动到中心
    一开始的uv长这样
    在这里插入图片描述
    在这里插入图片描述

    • -2和-1是为了垂直翻转我们的uv
  • 然后和我们的摄像机向量结合起来,值得注意的是,摄像机向量是世界坐标系下的,而uv是切线空间下的,所以要对摄像机向量做空间转化

摄像机向量是物体上的点到镜头的向量,不要搞混了

  • 按着这个连
    在这里插入图片描述
    • 具体的数学推导等我看一下书

2、利用噪音虚拟化室内

要制作一栋大楼可以这个样子:
在这里插入图片描述
但是问题是很明显的,比如这个上面的太重复了,一眼就看出来了。
我们利用随机数,尝试让1/2/3/4面作为后墙,可能效果会很好

所以最开始我们需要创造一个随机数:
在这里插入图片描述
在这里插入图片描述
unity的其实是差不多的,没有细看了

3、内装着色器

首先我们把这个内容打包乘一个材质函数
在这里插入图片描述

  • 注意有两个输出,两个输入
  • 在unity里面创建子图就ok,也可以打包材质函数

在这里插入图片描述

  • 这一步主要就是蒙版套蒙版,不难理解

4、一些改进

在制作的过程中,我们会发现着栋大楼的顶端映射的并不是地面,而是和侧面一样用的是正侧面,所以我们会想办法结合物体空间改进这个大楼
在这里插入图片描述
如图所示的两个地方是对比我们之前给出的内装着色器变化的地方,除此之外输入的向量也由2变成了3,因为要区分上下前后左右
在这里插入图片描述

  • 主要思想就是,保证上下两个面是不变的,前后左右可以变

五、卡通着色器

卡通着色三要素:颜色,高光,外边线

1、颜色

Unity
PS里的纹理映射:
在这里插入图片描述
在这里插入图片描述

创造一张这个样子的纹理映射图
把 srgb 、mipmap关掉,并且设置压缩格式为未压缩的(RGB24),打包格式(wrap mode)为clamp
在这里插入图片描述

  • 如图所示

UE
在这里插入图片描述
先把着色模型设置为无光照
在这里插入图片描述
然后和unity差不多的连接思路

  • 但是ue的光照也叫做:Atmosphere Sun Light Vector,这个可以替换.但是实际上我没有找到这个节点,而是另外一个
    在这里插入图片描述

2、外边线

第一种算法:

  • 在这里插入图片描述
    这个是蒙版,可以看到,只有周围是黑色的

  • List item
    然后设置了一个阈值,高于0.15的都是白色,低于0.15的都是黑色,与之前得到的颜色相乘就得到了一个外边线

  • unity的长这样
    在这里插入图片描述

  • 有一个很大的问题是只有圆型物体才是有效的,比如这个方体就有很明显的问题
    在这里插入图片描述
    第二种方式:
    非常简单粗暴,模型复制黏贴,把一个模型稍微扩大并且面反向,并且打开背面剔除,这种做法我不喜欢,太贵了。

第三种方式:
在深度缓存区域找到边缘过滤器,把那些跨度跳跃很大的区域涂成黑色的。
我准备把NPR渲染放在后面捋一下,这一块有很多东西我还想深入学习的

3、高光算法

布林冯模型是老朋友了!
第一种:Blinn
思路是测量光源和人眼到法向量的角度,离得近的反射光强
在这里插入图片描述
第二种:Phong
在这里插入图片描述
phong的模型在外围有溢出光的感觉,更加真实
在这里插入图片描述
然后调整系数并且与之前的相混合就可以

unity的算法差不多
在这里插入图片描述

在这里插入图片描述

一些感想

在查询matcap有关的资料的时候,有人说如果想更多的了解可以多看看GPU Pro系列的。
然后我在网上一查发现有大佬已经做过这本书的笔记记录了,而且很详细。那是2018年的文章,我翻到评论区,有人在问会出pdf版本吗,然后那个作者回答说会出的。
我再往下翻了一下,然后看到了致敬。我才记起来,是毛星云啊。
勉励一下自己,来日继续努力。
这个系列算得上是比较基础的,我下一次做的话可能会想去复刻一些比较复杂的着色器,当然我也有可能先去过一下houdini,或者其他的一些TA向的。
好就这样。

猜你喜欢

转载自blog.csdn.net/woshi_wst/article/details/125684807