我正在使用C++编写一个简单的图形引擎,可以表示地球。地球被建模为一个“大地球体”,我计划使用每个顶点的法线来映射它的纹理。为此,我需要从顶点的法线中获取垂直和水平坐标(分别为φ和θ,即纬度和经度)。
以下是实现我的方法的函数代码(进行了编辑),用于在生成新顶点时返回从(0,0)到(1,1)之间的纹理坐标,参数n为法向量:
然而,这样做会产生意外的结果。使用此测试图片,我的正二十面体看起来是这样的:
以下是实现我的方法的函数代码(进行了编辑),用于在生成新顶点时返回从(0,0)到(1,1)之间的纹理坐标,参数n为法向量:
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);
}
然而,这样做会产生意外的结果。使用此测试图片,我的正二十面体看起来是这样的:
小白色和红色三角形位于(x,y,z) = (1,0,0)
。在第一张图像中,我使用较少的三角面生成了正二十面体(320个),而在后者中,正二十面体是由约82k个三角形生成的。
我怀疑导致这些纹理“故障”的原因是坐标(0,*)
和(1,*)
不被视为相邻。是否有适当的方法来解决这个问题?
NB:这些是我的纹理参数:
/* 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);
getTexCoord
函数在我看来是正确的。 - Christopher Oicles(0,y)
和(1,y)
。对于这些情况,在顶点位于不同边缘时,纹理被压缩而不是将纹理边缘视为相邻。这可能是问题的原因吗? - Carles Araguz