На изображении ниже изображено 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
Обновленная информация:
В 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.
Спасибо всем!