球体OpenGL UV映射问题导致伪影现象

3

经度上的伪影

我正在对一个三维球体 X、Y、Z 坐标进行二维纹理映射,使用的公式为:

u = (0.5 + atan2(X, Y) / (2 * glm::pi<double>()));
v = (0.5 - asin(Z) / glm::pi<double>());

在现代的OpenGL C++中。

我不知道为什么这个球体上会出现这种瑕疵。无法弄清楚。


{btsdaf} - abstractnature
4
这些文物出现在纹理坐标翻转点(当它们从1返回到0的面)。唯一解决这个问题的方法是复制一个环的顶点,然后给其中一个圆圈分配纹理坐标0,另一个圆圈分配纹理坐标1。注意,您还必须调整索引。 - BDL
1
{btsdaf} - abstractnature
Yes, exactly :) - BDL
2个回答

1

好的,我已经弄清楚并纠正了这个问题,现在终于在这里回答。

非常感谢BDL和Rabbid76。

每当u == 0时,我将相同顶点位置(X Y Z)添加到顶点向量(或数组)中,并增加索引,但这次硬编码纹理u为1.0f。

现在没有问题了,接缝看起来完美无瑕。


你能否澄清一下或展示一些代码吗?我不明白你所说的添加相同的顶点位置是什么意思。 - Sti

0

这是一个带索引的纹理球几何体的详细信息。为了获得更好的性能,您应该使用索引: m_meridians和m_latitudes是球体的详细级别。

for (size_t i = 0; i < m_meridians + 1; i++)
{
    for (size_t j = 0; j < m_latitudes + 2; j++)
    {
        // texCoord in the range [(0,0), (1,1)]
       QVector2D texCoord((float)i / m_meridians, (float)j / (m_latitudes+1));
        // theta = longitude from 0 to 2pi
        // phi = latitude from -pi/2 to pi/2
        double theta, phi;
        theta = 2*M_PI * texCoord.x();
        phi = M_PI * texCoord.y() - M_PI_2;
        QVector3D pos;
        pos.setY((float)std::sin(phi));
        pos.setX((float)std::cos(phi) * std::cos(theta));
        pos.setZ((float)std::cos(phi) * std::sin(theta));

        m_vertices.push_back({pos, texCoord});
    }
}

// Calculate triangle indices

for (size_t i = 0; i < m_meridians; i++)
{
    // Construct triangles between successive meridians
    for (size_t j = 0; j < m_latitudes + 1; j++)
    {
        m_indices.push_back(i * (m_latitudes+2) + j);
        m_indices.push_back(i * (m_latitudes+2) + j+1);
        m_indices.push_back((i+1) * (m_latitudes+2) + j+1);

        m_triangleCount++;

        m_indices.push_back((i+1) * (m_latitudes+2) + j+1);
        m_indices.push_back((i+1) * (m_latitudes+2) + j);
        m_indices.push_back(i * (m_latitudes+2) + j);

        m_triangleCount++;
    }
}

{btsdaf} - BDL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接