Я наносю UV-изображение на 2D-текстуру 3D-сферы с координатами X, Y, Z, используя формулу
u = (0.5 + atan2(X, Y) / (2 * glm::pi<double>()));
v = (0.5 - asin(Z) / glm::pi<double>());
в современном openGL C ++.
Я не знаю, почему в сфере есть этот артефакт. Не могу понять это.
Хорошо, я понял и исправил это, думал, что я наконец-то здесь отвечу.
Большое спасибо BDL и Rabbid76.
Всякий раз, когда u == 0, я добавлял ту же самую позицию вершины (X Y Z) к вектору вершин (или массиву) и также увеличивал индекс, но на этот раз жестко закодировал текстуру u, чтобы она равнялась 1,0f.
Никаких проблем сейчас, шов выглядит отлично.
Это деталь геометрии текстурированной сферы, которая индексируется. Вы должны использовать индекс для лучшей производительности:
m_meridians и m_latitude — уровень детализации сферы.
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++;
}
}