顶点属性插值
2014-07-15 06:44
337 查看
读者需要了解GPU固定管线关于Perspective-Correct Interpolation的基本概念,请参阅《
Mathematics for 3D Game Programming and Computer Graphics
》 BY Eric Lengyel中相关章节Chapter 5顶点属性插值公式
顶点属性插值是GPU固定渲染管线的功能,其基本插值公式为:假定三维空间中三角形顶点为p1,p2,p3,当前渲染的像素对应其上的点的坐标为q,则可以确定q的坐标可以由p1,p2,p3的坐标按照和为1的权重c1,c2,c3插值而来:
证明方法是首先证明p1,p2定义的线段中的任意一点m可由p1,p2按照和为1的权重a1,a2插值而来,因为:
其中a2在[0,1]之间。这样就可以再由m跟p3插值得到三角形内任意点。最终得到上面的公式。
属性插值就会使用相同的权重c1,c2,c3插值p1,p2,p3的属性得到q的对应属性。现在我们来问一个非常重要的问题:
此插值公式的权重代表什么?
对于两点p1,p1之间任意点m的插值,这个问题容易回答,根据上面的(2)式已经可以知道,插值a2和(1-a2)权重实际上是m到p1和p2的归一化距离。如上图所示而三点之间的任何一点p,根据两次使用上面的公式可以得到p1的权重是a1*b2,p2的权重是a2*b2,p3的权重是b1,这三个权重可以容易证明正好是三角形p2p3p,三角形p1p3p和三角形p1p2m的面积跟三角形p1p2p3总面积的比值。如上图红绿蓝三个子三角形所示。
什么属性适合用此插值公式传递到顶点?
为什么这个问题重要?因为任何属性都来自顶点描述,通过此插值方式传递到像素级别。可以通过理解插值公式的权重来确定这个问题的答案,也就是:
跟像素点坐标一样,能够使用归一化距离(对于三点就是归一化面积)进行线性插值的属性,就可以利用GPU固定管线的属性插值进行传递。
顶点颜色属性
颜色使用归一化距离插值只是一种选择,保证颜色的平滑过度,并无特别含义纹理坐标属性
纹理坐标是三角形所在平面内的顶点属性,从两点来说,显然纹理坐标就是需要根据归一化距离进行线性插值的。向量属性(例如切空间基或其中的向量)
如果三角形各个顶点的切空间都是一个(例如地面,墙面),则插值结果也不会有差别。如果三角形各个顶点的切空间不同(例如三角形是球面,曲面上的一个割平面),则插值结果将会具有什么意义?
首先通过一个两点插值的例子说明,这样的插值并非是一个逐渐将p1处的向量旋转到p2处的过程:
假设p1处向量为(-1,0,0),p2处向量变为(1,0,0),则可知插值结果是一个指向x轴负方向不断缩短的向量,直到线段中点方向发生反转,指向x轴正方向不断深长,整个过程都不可能脱离x轴,而非是一个从起始位置逐渐旋转到终止位置的过程。
现在我们用公式精细描述一下这个插值过程,假设p1顶点属性向量为n1,p2顶点属性向量为n2,根据(2):
因此整个插值过程可以理解为从n1出发,沿着直线方向(n2-n1),逐渐过渡到n2。过渡的进程(a2)跟p从p1到p2的进程同步。
即使顶点向量长度都归一化,插值过程也不能保证结果归一化。
两个顶点属性向量m,n相互垂直。插值过程不能保证插值结果仍然相互垂直,因为下式不一定为零:
但是需要注意的是,使用精细的三角形近似曲面时,顶点之间的向量差别并不会像上面的例子中那么大,当方向差别不特别大时,这个插值过程可以近似认为是渐变旋转,此时可以近似认为其长度保持,垂直性近似保持等。实际上normal mapping过程中为了得到pixel级别的切空间基,只能使用此种插值近似,别无他法。
经过固定线性变换的可插值顶点属性
假设某个顶点属性n已经证实可以使用插值传递到像素渲染器,那么其经过某个固定线性变换的对应属性也可以使用插值传递到像素渲染器。举个简单例子,加入我们需要纹理坐标(s, t)进行一个线性变换T,也就是:
则这个变换可以在像素渲染器内执行,如果T在一个三角形或四边形(总之是一个primitive)内恒定不变,则我们也可以在顶点属性级别执行此变换,插值过程可以自动给出正确的变换后(s’t’),这是因为在式子(3)的两侧同时乘以变换矩阵T不改变其成立,同时所有属性都变化为变换后的形式。
再比如在parallax mapping技术中,经常见到的一个实现方案需要把从当前点到摄像机之间的方向向量eyeRay传递到像素渲染器,这并非一个非常直观简单的传递,首先不能传递归一化的方向向量,而只能传递未归一化的,因为这样的向量相当于点坐标的线性变换,可以准确使用GPU固定管线插值公式,其次这个eyeRay需要以切空间向量表达,当三角形的三个顶点的切空间一致(例如平面内的三角形)时,这个变换也可以在顶点属性上完成。
相关文章推荐
- opengl 教程(9) 顶点属性插值
- openGL 顶点属性插值
- opengl 教程(9) 顶点属性插值
- Android 插值属性动画Property Animation
- OpenGL ES中的顶点数组、顶点属性、缓冲区对象
- 多个顶点属性使用一个类型的VBO & VAO的使用和操作
- OpenGl Vertex Atrributes(顶点属性)
- 顶点属性相关
- 粒子系统基本原理 给出粒子中心点的坐标和粒子的大小,则很容易计算出粒子所需要的4个顶点的位置坐标。粒子系统由大量的粒子构成。每个粒子具有一组属性例如位置大小纹理颜色透明度运动速度加速度生命周期等属性。
- [C++/C] Boost 定义顶点属性
- Android属性动画(二)之插值器与估值器
- 处理顶点——在3D空间中使用Catmull-Rom插值生成额外的顶点
- Muli3D <8> 计算Shader中顶点属性相对于屏幕坐标的偏导数
- 顶点属性与顶点格式
- OpenGL的填充属性函数之纹理和插值图案
- OpenGL获取支持的顶点属性个数
- 5.10.3 顶点属性内插
- opengles顶点属性顶点数组缓存对象
- opengl es3.0学习篇四:顶点属性,顶点数组和缓冲区对象
- OpenGLES - glVertexAttribPointer 指定顶点属性及三个元素的指针起点