http://www.cnblogs.com/joeshifu/p/5489761.html
参考这篇,作者做旋转的时候没有使用旋转矩阵,而是用的两个点乘,不知道是如何推导的,有人知道嘛?
float2 swirl(float2 uv) { //先减去贴图中心点的纹理坐标,这样是方便旋转计算 uv -= float2(0.5, 0.5); //计算当前坐标与中心点的距离。 float dist = length(uv); //计算出旋转的百分比 float percent = (_Radius - dist) / _Radius; if (percent < 1.0 && percent >= 0.0) { //通过sin,cos来计算出旋转后的位置。 float theta = percent * percent * _Angle * 8.0; float s = sin(theta); float c = cos(theta); //uv = float2(dot(uv, float2(c, -s)), dot(uv, float2(s, c))); uv = float2(uv.x*c - uv.y*s, uv.x*s + uv.y*c); } //再加上贴图中心点的纹理坐标,这样才正确。 uv += float2(0.5, 0.5); return uv; }
//uv = float2(dot(uv, float2(c, -s)), dot(uv, float2(s, c))); uv = float2(uv.x*c - uv.y*s, uv.x*s + uv.y*c);