欢迎光临散文网 会员登陆 & 注册

09

2023-06-24 11:06 作者:绝剑结城  | 我要投稿

首先是菲涅尔,其实我之前自己研究描边的时候都搞出了个类似的,不过后面的处理太错误了。正确的处理还是oneminus和power。唉,真是妙啊。不过也可能是我当时太菜了,所以底子还是很重要的。

然后是Matcap(Material Capture(材质捕捉))。用来造假的光照效果,不用任何光照信息,只用个贴图。首先要把法线贴图转到观察空间(view space,以相机为中心,镜头后方是+z轴,右方是+x轴,上方是+y轴,所以指向镜头的面是蓝色,指向镜头上方的是绿色,指向镜头右方的是红色)(在不同的空间下法线贴图呈现不同的颜色,但是实际上,法线还是那个法线,只是基不同,导致坐标值不同,导致显示出来的颜色不同)。

然后取RG通道(此时它们映射都是从-1到1),然后重映射为(0到1),以此作为采样的uv坐标。

然后采样一个圆形的matcap贴图,这里我解释下为什么是圆形。首先,最开始的rgb值代表的是一个归一化过的方向向量。对于一个模型的观察空间下的坐标,我们肯定只能看得到z为正的面,哪怕在最边缘,z也只是为0,而当z值为0的时候x方+y方=1。而当z值为正数的时候,x方+y方则肯定小于1。这样我们以一个球来代替物体的时候(因为球包含了所有方向的面),可以很明显看出xy的范围。

而因为纹理坐标的范围是如下图的0到1,所以为了采样就要把单位圆映射为以(0.5,0.5)为中心的这个小圆。

我上面应该解释得挺清楚了。然后把搞好的坐标来做uv采样matcap,即可得到最终效果,而且说实话效果挺好的(什么sssmatcap看起来还真有模有样)。但是移动视角(指的是物体在观察空间内的坐标移动,比如把物体从屏幕中央移到边缘)的话,就容易穿帮,原因:在透视投影下,将模型拉到屏幕的左右边缘,那么侧面的占的像素就会被拉宽,但是对应的MatCap的区域还是那么点。(大佬的总结https://zhuanlan.zhihu.com/p/415525195)

算了,我打算改变策略了,不什么都记录了,有些大佬笔记有的,我抄过来也没意义。我就对一些我想了比较久才懂的,或者说模糊不清的概念再做笔记。

这里记录一下手写cubemap代码的注意点。那些比较简单的问题,可以直接copy连连看代码的,我就不讲了。

首先是法线贴图,我发现sf用的是第一个代码,然后声明参数的时候要多声明一个ST后缀的float4。这两段代码的区别在于是否使用了TRANSFORM_TEX函数对纹理坐标进行了变换。TRANSFORM_TEX函数是一个Unity定义的宏,用于对纹理坐标进行缩放和偏移,以实现纹理的平铺和偏移效果。这个函数需要使用一个带有_ST后缀的属性来传递纹理的缩放和偏移参数,例如_BaseMap_ST2。如果不使用这个函数,那么纹理坐标就不会发生变化,纹理就会按照原始大小和位置贴在模型上。所以,第一段代码相当于对纹理进行了缩放和偏移(依据ST),而第二段代码则没有对纹理进行任何变换。

然后是声明菲涅尔强度值的时候,SF用了上面那个代码。这两种定义shader参数的方式的区别在于是否支持GPU instancing。GPU instancing是一种优化方法,可以在一次绘制调用中渲染多个相同网格和材质的实例,从而减少绘制调用的数量和提高性能。为了让shader支持GPU instancing,需要使用一些特定的宏和变量来声明和定义每个实例的属性。例如:

• UNITY_INSTANCING_BUFFER_START(Props)和UNITY_INSTANCING_BUFFER_END(Props):这两个宏用于声明一个名为Props的每个实例的常量缓冲区,用于存储每个实例的属性。

• UNITY_DEFINE_INSTANCED_PROP(float, _fresnel):这个宏用于定义一个类型为float,名为_fresnel的每个实例的属性。这个属性可以在shader中使用,也可以在材质检视面板中调整。

• UNITY_VERTEX_INPUT_INSTANCE_ID:这个宏用于在顶点着色器输入/输出结构中定义一个实例ID。这个ID可以用于访问每个实例的属性或其他信息。

使用这些宏和变量的好处是可以让shader支持GPU instancing,从而提高渲染效率。缺点是需要额外的代码和内存来存储每个实例的属性,而且不是所有平台和渲染管线都支持GPU instancing。

使用**uniform float _fresnel;**的方式则是定义一个全局的shader参数,这个参数对所有实例都是相同的,不会随着每个实例而改变。使用这种方式的好处是简单方便,不需要额外的代码和内存,而且兼容性更好。缺点是无法让shader支持GPU instancing,从而降低渲染效率。(来源newbing)


09的评论 (共 条)

分享到微博请遵守国家法律