Визуализация альфа-прозрачности в геометрии и определение альфа-цвета в растровом изображении - OpenGL - PullRequest
1 голос
/ 03 ноября 2011

Это вопрос из двух частей. Я рендеринг некоторой геометрии BSP, и некоторые текстуры имеют альфа-цвет, который должен быть невидимым.

Итак, первым шагом будет определение альфа-цвета, чтобы я мог правильно его отобразить. Я загрузил образец растрового изображения:

image

Как видите, это текстура перил, где RGB (160,158,148) - это цвет, который должен быть невидимым. Я могу понять это, просто посмотрев на это. Проблема в том, как найти это значение в файле?

Так что это первый шаг. Второй - это проблема OpenGL, в которой я рендерил кучу геометрии с помощью вершинных массивов. Как мне учесть тот факт, что цвет должен быть удален из текстуры при визуализации? Мне нужно сделать это в определенном порядке? Кроме того, я должен упомянуть, что я использую SDL, если это помогает облегчить все это.

Спасибо вам обоим за фантастические ответы. Я бы хотел выбрать вас обоих ...

Ответы [ 2 ]

3 голосов
/ 03 ноября 2011

и некоторые из текстур имеют альфа-цвет, который должен быть невидимым.

Это на самом деле называется цвет клавиш .

.Альфа-канал - это дополнительный канал, добавляющий к «обычным» каналам RGB.Когда используется альфа-смешение, в качестве непрозрачности используется значение альфа-канала.

Я могу понять это, просто взглянув на него.Проблема в том, как найти это значение в файле?

Если используется цветовая клавиша, используется либо какой-то определенный цвет, используемый для всех изображений, либо отдельно сохраняется значение клавиши, загружаяэто с файлом изображения.Другим распространенным методом является использование значения левого верхнего пикселя в качестве основного цвета.

Как мне учесть тот факт, что цвет должен быть удален из текстуры при визуализации?

При подготовке данных изображения с помощью альфа-канала, созданного с помощью цветового ключа:

for(i = 0; i < pixelcount; i++) {
    if( source[i].r == key.r && source[i].g == key.g && source[i].b == key.b ) {
        dest[i].r = dest[i].g = dest[i].b = dest[i].a = 0;
        continue;
    }
    dest[i].r = source[i].r;
    dest[i].g = source[i].g;
    dest[i].b = source[i].b;
    dest[i].a = 255;
}

Обновление : В случае альфа-канала, созданного с помощью цветового ключа, можно использовать альфа-тестирование вместо смешивания.Что хорошо при альфа-тестировании, так это то, что он не требует глубокой сортировки геометрии перед рисованием.

glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0.5);

Идеальный способ - использовать формат файла изображения с поддержкой альфа-канала(PNG, TGA, OpenEXR,…), и не использовать BMP (фактически формат файла BMP допускает 4-й канал, и фактически я однажды написал свой собственный загрузчик BMP с поддержкой альфа-канала и плагин экспорта Photoshop, многие годыназад).

2 голосов
/ 03 ноября 2011

Альфа-тестирование - мой метод перехода, если я хочу полной прозрачности.Сортировка не требуется.

Если ваше изображение идет, преобразуйте его в формат PNG и установите альфа на ноль для каждого пикселя RGB (160 158 148) и 255 для всех остальных.Тогда вы можете использовать альфа-тест.

Вам может потребоваться изменить RGB (160,158,148) пикселей на RGB (255,255,255), чтобы избежать каких-либо странных ореолов при фильтрации GL_LINEAR.Но это было давно, и я не уверен на 100% в этом.

...