Страницы

Поиск по вопросам

четверг, 9 января 2020 г.

Странности с индексированием вершин и интерполяцией цветов в OpenGL

#cpp #opengl #графика


Заметил интересную особенность в OpenGL, связанную с индексированием вершин, и пока-что
не могу понять почему так происходит.

Итак, в чем суть:

Порядок обхода вершин для видимых граней у меня по часовой стрелке. Есть 4 вершины
(обычный прямоугольник), заданы они примерно следующим образом:


В массиве они лежат вот так :

    vertices[DefaultGeometryType::PLANE] = {
        { { (size / 2), (size / 2), 0.0f },{ 1.0f,0.0f,0.0f },{ 1.0f,1.0f } },
        { { (size / 2), -(size / 2), 0.0f },{ 0.0f,1.0f,0.0f },{ 1.0f,0.0f } },
        { { -(size / 2), -(size / 2), 0.0f },{ 0.0f,0.0f,1.0f },{ 0.0f,0.0f } },
        { { -(size / 2), (size / 2),  0.0f },{ 1.0f,1.0f,0.0f },{ 0.0f,1.0f } },
    };


Затем у меня есть массив индексов для этого квадрата. Он выглядит так :

    indices[DefaultGeometryType::PLANE] = {
        0,1,2,0,2,3
    };


Таким образом получается, что квадрат разбивается на 2 треугольника с общими вершинами
0 и 2 (диагональ 0-2 будет общим ребром для этих двух треугольников). В итоге я получаю
вот такую картину:



Вроде бы все в порядке. И тут я решил немного поменять индексы, чтобы общим ребром
для двух треугольников была диагональ не 0-2 а 3-1. Я изменил индексы следующим образом:

3,0,1,1,2,3


И в итоге квадрат стал выглядеть вот так:



Согласитесь, картина совершенно другая. Такое ощущение что интерполяция цветов происходит
не совсем корректно. Я пробовал разные варианты порядка индексов, но всегда получалось
так, что когда прямоугольник делится по диагонали 0-2 - все хорошо, а когда 3-1 - такая
странная картина. Но почему? Может это какое-то неправильное индексирование вершин?
Есть ли какие-то правила корректного индексирования? Или же я что-то упускаю и на самом
деле так и должно быть?
    


Ответы

Ответ 1



Картинки правильные. Просто вы видимо ожидаете получить в итоге gradient-to-gradient gradient, а по факту тут два отдельных градиента. Заметьте, что цвет вершины, не принадлежащей данному треугольнику, для вычисления цвета пикселей этого треугольника не используется. Для построения "правильного" градиента пришлось бы сначала рассчитать градиент для каждого пикселя между вершинами 0 - 1 и 2 - 3, а затем рисовать сетку прямоугольников высотой в один пиксель. В более продвинутой форме такое реализуется например в Direct2d:

Комментариев нет:

Отправить комментарий