尝试将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得到了很好的解释,尽管如此,我仍然无法解决这个问题。从我读过的内容来看,我必须创建一对重复的顶点。有谁知道一些好的和有效的方法吗?
答案 0 :(得分:2)
你遇到的问题是,在接缝处你的纹理坐标“滚动”回0,所以你得到整个纹理映射,镜像到接缝上。为避免这种情况,您应该使用GL_WRAP
重复模式,并在接缝处使用纹理坐标为>= 1
的顶点(不要回滚到0)。请记住,顶点由其所有属性的整个元组组成,而具有不同属性值的顶点在整体上是不同的,因此尝试“共享”顶点没有意义。
答案 1 :(得分:1)
另一种方法是简单地将球体的对象坐标传递给像素着色器,并在“完美”球形空间中计算UV。
请注意,您需要传递局部导数,这样您不仅可以将接缝从几个像素减少到一个像素。
否则,是的。您需要沿着与u = 0相同的边复制顶点,同样重复极点处的顶点。这样,您的对象拓扑将变为矩形:就像纹理一样。