5

尝试将 UV 坐标映射到球体时出现以下问题 在此处输入图像描述

这是我用来获取 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中得到了很好的解释,虽然,我仍然不明白如何解决它。根据我一直在阅读的内容,我必须创建一对重复的顶点。有谁知道一些好的和有效的方法吗?

4

2 回答 2

2

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

于 2013-11-23T12:40:51.530 回答
1

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

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

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

于 2013-11-23T04:40:52.450 回答