Что может вызвать различия в альфа-смешении OpenGL между Windows и OS X? - PullRequest
10 голосов
/ 11 февраля 2011

На изображении ниже изображено 3 фона: черно-белый и серый

На каждом изображены 3 полосы: черный -> прозрачный, белый -> прозрачный и цвета -> прозрачный

Я использую glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);и все мои цвета вершин 1,1,1,0.

Дефект действительно виден в белом-> прозрачном на белом фоне.

В Windows XP (и других версиях Windows), это работает отлично, и я становлюсь полностью белым.На Mac же я посередине становлюсь серым!

Что может вызвать это, и почему оно становится темнее, когда я смешиваю белое с белым?

Снимок экрана в полном размереis @ http://dl.dropbox.com/u/9410632/mac-colorbad.png

Screenshot

Обновленная информация:

В Windows это не имеет значения для версии opengl.2.0 до 3.2, все работает.На Mac, который у меня передо мной сейчас, он равен 2.1.

Градиенты содержались в текстурах, и все вершины окрашены в 1,1,1,1 (белый RGB, полная альфа).Фоны представляют собой текстуры размером 1x1 пикселя (с наложением градиентов), а вершины окрашиваются по мере необходимости, с полной альфа.

Атлас создается с glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_BGRA, GL_UNSIGNED_BYTE, data); Он создается из файла ARGB dds, который я сам создал.

Следует также отметить, что все отрисовывается с помощью тривиально простого шейдера:

uniform sampler2D tex1;
uniform float alpha;

void main() {
    gl_FragColor = gl_Color * texture2D(tex1, gl_TexCoord[0].st) * vec4(1.0, 1.0, 1.0, alpha);
}

альфа-униформа установлена ​​на 1,0

Теперь я попытался изменитьтак что белый градиент был не текстурой, а всего лишь 4 вершинами, где левые были сплошными белыми и непрозрачными, а правые были 1,1,1,0, и это сработало!

У меня есть тройкапроверил текстуру сейчас, и она только белая, с переменной альфа 1.0-> 0.0.

Я думаю, что это может быть проблемой по умолчанию.Версия opengl или драйвера может инициализировать вещи по-разному.

Например, недавно я обнаружил, что у всех GL_TEXTURE_2D glEnabled по умолчанию, но нет Intel GME965.

РЕШЕНИЕ НАЙДЕНО

Во-первых, немного больше фона.Эта программа на самом деле написана на .NET (с использованием Mono на OS X), и файл DDS, который я пишу, представляет собой атлас, автоматически генерируемый путем сжатия каталога из 24-битных файлов PNG в наименьшую возможную текстуру.Я загружаю эти PNG-файлы с помощью System.Drawing.Bitmap и отображаю их в увеличенное изображение после определения макета.Затем этот пост-макет Bitmap блокируется (чтобы получить его в байтах), и они записываются в DDS с помощью кода, который я написал.

Прочитав совет Бахбара, я проверил текстуры в памяти, и онибыли действительно разные!Мой загруженный DDS кажется виновником, а не настройками OpenGL.Сегодня я догадался, что сам файл DDS был проверен на двух платформах (используя байт для сравнения байтов), и они действительно были разными!Когда я загружаю файлы DDS с помощью WTV (http://developer.nvidia.com/object/windows_texture_viewer.html), они выглядят одинаково.Однако, используя WTV, вы можете отключить каждый канал (RGBA).Когда я отключил альфа-канал, на окнах я увидел действительно плохо выглядящее изображение.Никакая альфа не приведет к сглаживанию краев, поэтому, конечно, это будет выглядеть ужасно.Когда я выключил альфа-канал на OSX DDS, он выглядел нормально!

Загрузчик PNG в Mono предварительно умножается, вызывая все мои проблемы.Я ввел для них билет (https://bugzilla.novell.com/show_bug.cgi?id=679242) и сразу переключился на использование libpng.

Спасибо всем!

Ответы [ 2 ]

2 голосов
/ 11 февраля 2011

Это немного удар в темноте, но проверьте (или явно установите) режимы передачи пикселей.

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

Вы также можете проверить правильность результата Mac (с текстурами), установив режим смешивания на * 1005.*.

1 голос
/ 16 февраля 2011

Проверьте ваш загрузчик dds.Это может быть предварительное умножение, о котором говорил Джон Варфоломей при загрузке, только на одной платформе.

Простой способ проверить это также посмотреть на данные, загружаемые в текстурувызов glTexImage.Эти данные полностью однородны?

...