如何正确地将2D图像纹理映射到icosphere 我正在编程C++中的一个简单的图形引擎,它应该能够代表地球。地球被建模为一个icosphere,我计划使用每个顶点的法线映射其纹理。为了做到这一点,我基本上尝试从顶点的法线获取垂直和水平坐标(分别是φ和θ)(即纬度和经度)

如何正确地将2D图像纹理映射到icosphere 我正在编程C++中的一个简单的图形引擎,它应该能够代表地球。地球被建模为一个icosphere,我计划使用每个顶点的法线映射其纹理。为了做到这一点,我基本上尝试从顶点的法线获取垂直和水平坐标(分别是φ和θ)(即纬度和经度),c++,opengl,textures,texture-mapping,C++,Opengl,Textures,Texture Mapping,以下是实现我的方法(生成新顶点时调用)的(已编辑)函数。当参数n为法向量时,它应将纹理坐标从(0,0)返回到(1,1): glm::vec2 Icosphere::getTexCoord(glm::vec3 n) { float theta = (atan2f(n.x, n.z) / PI) / 2.f + 0.5f; float phi = (asinf(-n.y) / (PI / 2.f)) / 2.f + 0.5f; return glm::vec2(theta,

以下是实现我的方法(生成新顶点时调用)的(已编辑)函数。当参数
n
为法向量时,它应将纹理坐标从
(0,0)
返回到
(1,1)

glm::vec2 Icosphere::getTexCoord(glm::vec3 n)
{
    float theta = (atan2f(n.x, n.z) / PI) / 2.f + 0.5f;
    float phi = (asinf(-n.y) / (PI / 2.f)) / 2.f + 0.5f;
    return glm::vec2(theta, phi);
}
然而,这正在产生意想不到的结果。使用,我的iSphere如下所示:

小的白色和红色三角形位于
(x,y,z)=(1,0,0)
。在第一幅图像中,我生成了具有较少三角形面的Iconsphere(320),而在后一幅图像中,Iconsphere生成了约82k个三角形

我怀疑导致这些纹理“小故障”的原因是坐标
(0,*)
(1,*)
不被认为是相邻的。有没有合适的方法

注意:以下是我的纹理参数:

/* Configure texture parameters: */
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glGenerateMipmap(GL_TEXTURE_2D);

我终于克服了这个丑陋的纹理贴图。这个问题确实是由图像球体中三角形的特征非均匀方向引起的。在二十面体中(以及在二十面体中),不可能在原点
(0,0,0)
中找到不与任何三角形相交的平面。如果我们想到地球,这意味着它的所有子午线都与一些三角形相交。这还意味着,在映射纹理时,位于纹理垂直边(即具有tex.coord.
(1,y)
(0,y)
)的三角形的某些顶点将位于任意一侧。发生这种情况时,将从
x对纹理进行插值≈1至
x≈0,产生我的图像中显示的效果

为了解决这个问题,我将纹理环绕设置为
GL\u REPEAT
,并简单地强制一些顶点远离纹理坐标空间(即
x>1
)。这允许纹理边缘相邻并完美映射纹理:

/* Configure texture parameters: */
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); // Not GL_CLAMP_TO_EDGE.
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); // Not GL_CLAMP_TO_EDGE.
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glGenerateMipmap(GL_TEXTURE_2D);
结果: 修改边中三角形的纹理坐标后(使用
GL\u夹紧到边
):

将纹理参数更改为
GL\u REPEAT


我的猜测是,在生成顶点法线集时,存在某种累积的浮点错误。如果我能看看那段代码,我也许能找到问题所在。对我来说,
getTexCoord
函数似乎是正确的。你可以尝试获取所有法线的向量和,看看它离零有多近。这可能会给你一个关于问题原因的线索。我会尝试看看这是否与我的法线有关,但我有疑问,因为我使用相同的法线渲染照明效果,它们看起来非常完美。我认为问题是由一些三角形的事实造成的(纹理边中的边在两侧都有顶点
(0,y)
(1,y)
。对于这些情况,当顶点位于不同的边上时,纹理会被压缩,而不是考虑相邻的纹理边。可能是这样吗?你的猜测比我的好。这就解释了为什么三角形较大的球体比三角形较小的球体变形更大。在此之前,我错误地认为第一张图片e有更多、更小的三角形,所以我现在觉得你的理论更好。你是如何检测出哪些顶点远离纹理坐标空间的?我不确定如何检测。