2D着色器绘制旋转球体的表示

我想显示一个三维纹理的球体,然后向一个方向旋转。 方向永远不会改变,相机将永远不会移动。 一种方法是实际创建一个球形网格,映射一个纹理,旋转球体,并在3D渲染。

我的问题是,有没有办法显示一个2D圆形,看起来像一个旋转的球体,只有一个2D着色器

换句话说,有人可能会想到一个技巧,比如用一种特殊的方式将一个纹理映射到圆上,从而得到一个从侧面看的就地旋转球体的外观?

我不需要精确的着色器代码,我只是在寻找正确的想法。

您可以在应用于四边形的像素着色器中执行球形投影。

假设球体以四边形为中心并且投影是正交的(透视投影会变得稍微困难​​,但是如果在着色器中传递反转视图和投影matrix,您也应该设法做到这一点)。

通常的方法不是查询纹理坐标:

gl_FragColor = texture2D(texture, texCoord); 

您可以使用texCoord作为球形纹理映射的最终坐标,并通过反转过程来检索原始纹理坐标:

 float x = 2.0 * (texCoord.x - 0.5); float y = 2.0 * (texCoord.y - 0.5); float r = sqrt(x * x + y * y); float d = r ? asin(r) / r : 0.0; float x2 = d * x; float y2 = d * y; 

现在x2y2π之间的值。 你需要根据你的timevariables“滚动”纹理,并规范你的纹理坐标。 围绕Y轴简单旋转:

 float x3 = mod(x2 / (4.0 * pi) + 0.5 + time, 1.0f); float y3 = y2 / (2.0 * pi) + 0.5; 

然后最后查询纹理,但只有当我们落在球体内时:

 if (r <= 1.0) gl_FragColor = texture2D(texture, vec2(x3, y3)); else ; /* Choose something to do here */ 

如果它不必非常准确,那么可以编写一个简单的2D位移贴图filter(像这个像素着色器着色器 )。 然后使用2D法线贴图来实现球形效果。 下面是一张显示结果的图片(上图)和法线图(下图)[ 来源 ]:

2D球面位移

为了赋予旋转球体的效果,您只需移动图像(棋盘格)并用圆圈掩盖(或discard圆形半径外的所有像素)。

您可能会发现http://www.voofoostudios.com/?p=33有用&#x3002;

请注意,朝向屏幕边缘的球体将不会以2D圆圈表示 – 透视图会使其变形一点。