C++ 球体(具有接缝)的OpenGL UV映射
我在尝试将UV坐标映射到球体时遇到以下问题 这是我用来获取UV坐标的代码C++ 球体(具有接缝)的OpenGL UV映射,c++,opengl,geometry,glsl,uv-mapping,C++,Opengl,Geometry,Glsl,Uv Mapping,我在尝试将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::vec
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);
}
这个问题在这里得到了很好的解释,尽管我仍然不知道如何解决它。根据我所阅读的内容,我必须创建一对重复的顶点。有人知道一些有效的方法吗?另一种方法是将球体的对象坐标传递到像素着色器中,然后在“完美”的球体空间中计算UV 请注意,您将需要传递局部导数,以便不仅仅将接缝从几个像素减少到一个像素
否则,是的。您需要沿u=0的同一条边复制顶点,并在极点重复顶点。这样,您的对象拓扑将变成一个矩形:就像您的纹理一样。您遇到的问题是,在接缝处,您的纹理坐标“回滚”到0,因此您可以将整个纹理映射,镜像到接缝上。为了避免这种情况,应使用
GL_WRAP
重复模式,并在接缝结束处使用纹理坐标=1的顶点(不要回滚到0)。请记住,顶点由其所有属性的整个元组组成,而具有不同属性值的顶点在整体上是不同的,因此尝试“共享”顶点是没有意义的。Ahhh,一个有趣的球体纹理映射老问题。我见过的最普遍的解决方案之一在这里详细介绍(这是一个与图形相关的奇妙资源)链接:我的问题是,我无法在片段着色器中真正计算uv,因为我有其他非球体的对象。我知道我可以设置一些“对象类型”变量,但我并不想使着色器过于复杂。我仍然不明白复制顶点到底意味着什么。。。这是否意味着我必须“手动”添加这些误差,并将它们的UV坐标设置为1?考虑圆的情况。假设你把它简化成五角大楼。有五个顶点,是吗?但是如果你想正确地对它进行UV贴图(或者在这个简化的例子中,只需“U”贴图),你需要六个顶点:[0.0,0.2,0.4,0.6,0.8,1.0]--如果你没有“重复”顶点在末尾,那么最后一个跨度的贴图,从0.8到1,将从0.8到0.0,“向后”,可能您已经有了正确的顶点计数,但您只是错误地计算了最终位置中复制顶点的值,因为当您真正想要360度时,calcUV()trig表示0度。具体正确的解决方案留给你们,因为最好的解决方案是理解模型的拓扑结构,并且你们已经声明,你们正在使用的真实模型不是你们正在展示的模型。