Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 球体(具有接缝)的OpenGL UV映射_C++_Opengl_Geometry_Glsl_Uv Mapping - Fatal编程技术网

C++ 球体(具有接缝)的OpenGL 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

我在尝试将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);
}

这个问题在这里得到了很好的解释,尽管我仍然不知道如何解决它。根据我所阅读的内容,我必须创建一对重复的顶点。有人知道一些有效的方法吗?

另一种方法是将球体的对象坐标传递到像素着色器中,然后在“完美”的球体空间中计算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度。具体正确的解决方案留给你们,因为最好的解决方案是理解模型的拓扑结构,并且你们已经声明,你们正在使用的真实模型不是你们正在展示的模型。