Shader—极坐标纹理采样
如下是我对极坐标纹理采样的一些理解。
1 | // 直角坐标转极坐标 |
如上只给出了和极坐标纹理采样有关的shader代码,这并不是完整的shader解构。

RectToPolar()
函数不在此过多描述,其代码就是对直角坐标转换为极坐标的常规思路的实现。其得到的结果theta
是纹理上一点uv
和纹理原点centerUV
确定的向量和水平方向的夹角,r
是该向量的长度。算出角度等于theta
的纹理坐标不止一个,这些坐标显然都位于一条射线上(例如下图左边蓝色的线),它们之间的差异就由到纹理原点centerUV
的距离r
来确定。
那么直接用theta
和r
对纹理采样会得到什么呢?
上述代码13行将theta
从 [-\(\pi\), \(\pi\)]映射到了[0, 1],相当于把一个圆展开成一条线段,原本从-\(\pi\)开始的每一个角度现在都映射到了u轴上,从0开始一直到1。

如上面左边的图所示,蓝色的线代表的是原始直角坐标系下相同角度theta
的纹理,右边的图中蓝色的框对应着用它们的坐标计算出的theta
和r
直接对纹理采样得到的结果。

综上所述,如果对所有纹理坐标采样(也就是对所有的同心圆采样)的结果,应该得到的是形如下面圆锥形的俯视图的样子:

