球体的OpenGL UV贴图(有缝)

时间:2013-11-22 22:00:51

标签: c++ opengl geometry glsl uv-mapping

尝试将UV坐标映射到球体时出现以下问题 enter image description here

以下是我用来获取UV坐标的代码

glm::vec2 calcUV( glm::vec3 p)
{
    p = glm::normalize(p);

    const float PI = 3.1415926f;

    float u = ((glm::atan(p.x, p.z) / PI) + 1.0f) * 0.5f;
    float v = (asin(p.y) / PI) + 0.5f;

    return glm::vec2(u, v);
}

这个问题在stackoverflow question得到了很好的解释,尽管如此,我仍然无法解决这个问题。从我读过的内容来看,我必须创建一对重复的顶点。有谁知道一些好的和有效的方法吗?

2 个答案:

答案 0 :(得分:2)

你遇到的问题是,在接缝处你的纹理坐标“滚动”回0,所以你得到整个纹理映射,镜像到接缝上。为避免这种情况,您应该使用GL_WRAP重复模式,并在接缝处使用纹理坐标为>= 1的顶点(不要回滚到0)。请记住,顶点由其所有属性的整个元组组成,而具有不同属性值的顶点在整体上是不同的,因此尝试“共享”顶点没有意义。

答案 1 :(得分:1)

另一种方法是简单地将球体的对象坐标传递给像素着色器,并在“完美”球形空间中计算UV。

请注意,您需要传递局部导数,这样您不仅可以将接缝从几个像素减少到一个像素。

否则,是的。您需要沿着与u = 0相同的边复制顶点,同样重复极点处的顶点。这样,您的对象拓扑将变为矩形:就像纹理一样。