雅克比矩阵微分与纹理映射

2020.12.13
昨天跟一个哥们聊天讲到面试图形学过程中有人问到什么是雅克比矩阵微分;上网查了一下,雅克比矩阵微分是在微分场景下找到两个微分空间基底的线性变换矩阵。
 
 
【切空间就可以其理解为微分空间】
切空间都是矢量空间,都有基底,所以这个线性变换就是矩阵。在欧氏空间子空间的开集上,切空间就是某个。
所以把Jacobian矩阵看成切空间之间的基底之间的线性变换,
而矩阵的行列式的值的几何意义:是矩阵对应的线性变换前后的面积比。
这也是为什么积分中变换坐标时前面会乘以一个Jacobian矩阵的行列式。
 
下面举了个例子,对于机械臂来说如果每次都用xy的直角坐标来表示整个过程位置比较麻烦,所以采用角度和臂长来表示比较容易。同时又知道两者之间转化关系。那么我们问每次两个角速度变化时,xy的变化速度是多少?这时候就可以利用雅克比矩阵来计算每次角速度变化对xy的变化速率是多少。也即是由角速度的微分空间变换到了直角坐标系的微分空间。
 
 
雅克比行列式在图形学中的纹理映射中也有用到。参考文章:https://zhuanlan.zhihu.com/p/268618021
纹理映射一个需要处理的问题是纹理的抗锯齿问题。
 
比如上图将纹理贴到一个平面,当随着观察角度不同,会出现纹理的锯齿现象。解决方案是使每个像素不是点样本,而是使用当前屏幕2d像素计算出覆盖的纹理空间图像面积中所有像素的平均值
那么怎么计算一个像素覆盖多少纹理空间的面积?
一个像素所对应的纹理范围称为像素的纹理空间覆盖区,要计算这个覆盖区是挺复杂的一个事情,因为这个物体的表面有很大关系,表面可能是一个曲面。而且随着观察角度和位置不同,同一个屏幕像素的纹理空间覆盖区是不一样的。
 
上图总可以看到屏幕像素对应纹理空间不是一个矩形,而是不同的四边形,可能还是有曲率的。要计算这个曲面的覆盖像素比较麻烦。
那么这里计算这个覆盖区,即利用微分思想做一些近似。
下面有些绕,我们可以把屏幕的像素想象成一个微分单元,这个微分单元实际上对应我们渲染物体表面的一个点,这个点会对应一个纹理坐标。这里要注意,虽然纹理坐标我们是在直角坐标系下定义的,但实际上纹理空间并不一定是一个直角空间,可想象一个图片贴到一个曲面上,肯定是弯曲的,所以下图中纹素的真正走向其实是弯曲的线。所以从一个屏幕空间到一个纹素空间也不是线性的。比如看下图
 
但是当对于屏幕像素这个极小的微分单元下我们可以认为是线性的。这个映射过程就是uv左边分别对屏幕的x方向和y方向求导数。那么在该点处纹理坐标分别投影在屏幕xy方向构成了一个平行四边形。
即:
雅克比矩阵为:
这时候的雅可比矩阵定义是屏幕空间的像素变化与纹理空间变化的线性变换。
更专业的几何解释是:
所以这时候要做纹理抗锯齿就是在屏幕空间位置处的像素大小对应的纹理坐标导数定义的平行四边形轮廓范围内的纹素颜色的平均值。
那么接下来只要找出这个平行四边形覆盖的纹素即可。
 
这里让我想起glsl中的dFdx和dFdy两个函数,就是用来计算一个量在此点的屏幕空间方向的导数。
当然硬件这里的计算还是利用屏幕像素来做微分单元进行的。
这里能够计算,是因为GPU是以一个wrap来进行并行处理的,一个wrap来不同的显卡架构上是不一样的,有的是2x2的像素有的是32x32的像素。所以这里的偏导数就是像素块中变量的差值来计算出来的。dFdx表示的是像素块中右边像素的值减去素块中左边像素的值,而dFdy表示的是下面像素的值减去上面像素的值。
说到这里到可以考虑利用偏导数做一些图像处理,比如对于地图中某些要素在俯视图下出现锯齿问题,那么在片元着色器下,可以根据偏导数的大小决定是否绘制。
再比如焦散那篇文章中,文档:WebGL 水波及焦散(刻蚀)的渲染总结.n...
根据两个变量在偏导数上的乘积比来做一些决策:
现在再回到纹理采样这个问题上,上面说到只要找到纹理空间那个平行四边形的覆盖区域就行了。但是即使是这个平行四边形,仍然是极其昂贵的计算,所以在这个基础上又做了一些近似。比如双线性插值,其实是利用纹理坐标点的周围的四个像素并根据一定的权重来计算颜色值。
但是即使是双线性插值也是很昂贵的计算,需要一些硬件的支持。所以有的高性能系统有专门的纹理采样硬件来支持。
双线性插值是一种近似,所以有的时候并不是很好。也就诞生了其他的一些辅助的方法。比如mipmap和各向异性。(虎书中把这个查找过程称为滤波)
 
 
 
纹理挺坑的,说到这里还要介绍一个纹理的透视插值问题。这问题我之前有了解过,但是看一些图形库好像也没有专门处理这部分内容,不知道是不是硬件来处理了,所以没有太多关注。
这个可以看下面这篇文章,我先不确定这个过程是图形管线自己修复的还是需要开发者来修复。貌似看到的各种图形库都没有自己处理过这个问题。
 
 

posted @ 2020-12-14 20:03  木的树  阅读(889)  评论(3编辑  收藏  举报