Opengl:地球纹理

Posted

技术标签:

【中文标题】Opengl:地球纹理【英文标题】:Opengl: earth texturing 【发布时间】: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 我同意这一点,尽管这不是我评论的重点。 【参考方案1】:

问题在于你的 u 计算:

u=atan2f(p.y,p.x)/2*PI+0.5;

您将它乘以 2,然后将结果乘以 PI。你应该潜水 2 和 PI

u=atan2f(p.y,p.x)/(2*PI)+0.5;

【讨论】:

以上是关于Opengl:地球纹理的主要内容,如果未能解决你的问题,请参考以下文章

在 OpenGL 中将纹理映射到球体时出现接缝问题

将地球纹理贴图应用到 Sphere

OpenGL ES纹理

OpenGL-纹理(下)

opengl使用bmp纹理映射画不出东西

Windows 上的 OpenCL/OpenGL 纹理互操作:调整 OpenGL 纹理的大小