【发布时间】:2013-11-23 12:56:01
【问题描述】:
我正在尝试使用纹理在球体上绘制地球。我的球体由四边形组成,每个四边形由两个三角形组成:
void Sphere(float radius, int n_lat, int n_lon)
{
glEnable(GL_LIGHTING);
glEnable(GL_TEXTURE_2D);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
TextureManager::Inst()->BindTexture(1);
glBegin(GL_TRIANGLES);
for (float i = 0; i < n_lat; i += 1.f)
for (float j = 0; j < n_lon; j += 1.f)
{
Vector3 p;
GLfloat u;
GLfloat v;
// -- first triangle
p = SphereCoord(i, j, n_lat, n_lon);
glNormal3(p);
u=atan2f(p.y,p.x)/2*PI+0.5;
v=0.5-asinf(p.z)/PI;
glTexCoord2f(u,v);
glVertex3(p * radius);
p = SphereCoord(i + 1, j, n_lat, n_lon);
glNormal3(p);
u=atan2f(p.y,p.x)/2*PI+0.5;
v=0.5-asinf(p.z)/PI;
glTexCoord2f(u,v);
glVertex3(p * radius);
p = SphereCoord(i + 1, j + 1, n_lat, n_lon);
glNormal3(p);
u=atan2f(p.y,p.x)/2*PI+0.5;
v=0.5-asinf(p.z)/PI;
glTexCoord2f(u,v);
glVertex3(p * radius);
// -- second triangle
p = SphereCoord(i, j, n_lat, n_lon);
glNormal3(p);
u=atan2f(p.y,p.x)/2*PI+0.5;
v=0.5-asinf(p.z)/PI;
glTexCoord2f(u,v);
glVertex3(p * radius);
p = SphereCoord(i + 1, j + 1, n_lat, n_lon);
glNormal3(p);
u=atan2f(p.y,p.x)/2*PI+0.5;
v=0.5-asinf(p.z)/PI;
glTexCoord2f(u,v);
glVertex3(p * radius);
p = SphereCoord(i, j + 1, n_lat, n_lon);
glNormal3(p);
u=atan2f(p.y,p.x)/2*PI+0.5;
v=0.5-asinf(p.z)/PI;
glTexCoord2f(u,v);
glVertex3(p * radius);
}
glEnd();
}
使用此代码无法获得正确的纹理映射。谁能给我一些建议?
看起来纹理在经度轴上以某种方式重复:
【问题讨论】:
-
你应该停止使用固定函数管道函数,并使用更现代和不弃用的函数。
-
@user1071138 Let me Google that for you
-
我的问题不是球体,是纹理...看起来它在经度轴上重复
-
@Vallentin 我不同意。固定函数很适合开始学习 GL,否则对解决问题没有任何帮助。
-
@jozxyqk 我同意这一点,尽管这不是我评论的重点。