Артефакт проблемы УФ-картографирования в Sphere OpenGl

Артефакт по долготе

Я наносю 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 ++.

Я не знаю, почему в сфере есть этот артефакт. Не могу понять это.

3

Решение

Хорошо, я понял и исправил это, думал, что я наконец-то здесь отвечу.

Большое спасибо BDL и Rabbid76.

Всякий раз, когда u == 0, я добавлял ту же самую позицию вершины (X Y Z) к вектору вершин (или массиву) и также увеличивал индекс, но на этот раз жестко закодировал текстуру u, чтобы она равнялась 1,0f.

Никаких проблем сейчас, шов выглядит отлично.

1

Другие решения

Это деталь геометрии текстурированной сферы, которая индексируется. Вы должны использовать индекс для лучшей производительности:
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++;
}
}
0

По вопросам рекламы [email protected]