球体上的OpenGL纹理

我想在Android的OpenGL ES 1.0中创建一个滚动纹理的球。 有了这个function,我可以创建一个球体

public Ball(GL10 gl, float radius) { ByteBuffer bb = ByteBuffer.allocateDirect(40000); bb.order(ByteOrder.nativeOrder()); sphereVertex = bb.asFloatBuffer(); points = build(); } private int build() { double dTheta = STEP * Math.PI / 180; double dPhi = dTheta; int points = 0; for(double phi = -(Math.PI/2); phi <= Math.PI/2; phi+=dPhi) { for(double theta = 0.0; theta <= (Math.PI * 2); theta+=dTheta) { sphereVertex.put((float) (raduis * Math.sin(phi) * Math.cos(theta))); sphereVertex.put((float) (raduis * Math.sin(phi) * Math.sin(theta))); sphereVertex.put((float) (raduis * Math.cos(phi))); points++; } } sphereVertex.position(0); return points; } public void draw() { texture.bind(); gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glVertexPointer(3, GL10.GL_FLOAT, 0, sphereVertex); gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0, points); gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); } 

我现在的问题是,我想使用这个纹理的球体,但只有一个黑球创建(当然,因为右上角黑色)。 我使用这个纹理坐标,因为我想要使用整个纹理:

 0|0 0|1 1|1 1|0 

这是我从纹理三角形中学到的。 这是不正确的,如果我想用一个球体呢? 我需要做什么才能正确使用纹理?

使用二十面体球而不是极坐标。

二十面体的网可以很好地布置,就像这样:

在这里输入图像描述

在一个纹理编辑程序中,很容易UV图像具有良好/规则纹理形状的二十面体。

纹理坐标 – 在一个非常专业的术语中 – 是参数空间的一部分,它是通常在模型空间中的表面位置与那些纹理坐标之间的映射。 这些表面位置使用某种函数映射到参数空间。 换句话说,每个纹理坐标是将表面位置映射到参数空间(在2D图像的情况下为2D)的结果。

我想解释的一点是,纹理坐标用于确定每个纹理像素(也称为纹素)如何映射到表面位置。

现在回到你的问题,鉴于上述定义,你需要为每个顶点分配其2D纹理坐标,以便正确地将2D图像映射到3D球体。 OpenGL使用每个顶点属性,不能简单地使用给定的四个纹理坐标值,并暗示每个顶点的纹理坐标的其余部分。 您可能需要使用某种函数来生成纹理坐标,或者使用一个模型包,其中艺术家通常为每个顶点指定其纹理坐标。

有很多方法可以生成纹理坐标球,但是因为你正在生成一个UV球,所以最适合你的是在这个页面中被称为naiive appraoch来总结这个方法:

  • 将纬度经度直接映射到球体上
  • 使用比例为2×1的单个矩形纹理
  • 纹理坐标:u在赤道附近从0到1,v从0到1从极到极
  • 亲:简单,大多数数据源已经在这种格式
  • con:浪费了极点上的大部分纹理分辨率,通常最不需要的地方