У меня есть игра LibGDX с мультяшными облаками с плавным градиентом. Существуют и другие примеры градиентов в игре, которые имеют аналогичную проблему, но облака являются наиболее очевидным примером. Они отлично смотрятся в Android, на iOS и на настольной версии игры, но в версии WebGL градиенты не выглядят гладкими. Это похоже только на альфа-градиенты, которые имеют проблему. Другие градиенты выглядят нормально.Альфа-градиенты не гладкие в WebGL при использовании премультиплексной альфы
Я пробовал на трех разных устройствах в Chrome и IE, и все 3 дают одинаковые результаты. Здесь вы можете найти тест версии HTML5.
https://wordbuzzhtml5.appspot.com/canvas/
Я добавил пример IntelliJ проект на GitHub здесь
https://github.com/WillCalderwood/CloudTest
Если у вас есть IntelliJ, клонировать этот проект, откройте файл build.gradle, нажмите Alt-F12, типа gradlew html:superdev
, а затем перейти к http://localhost:8080/html/
критический код render()
here
Нижнее изображение здесь - настольная версия, верхняя часть - версия WebGL, работающая на одном и том же оборудовании.
Там нет ничего умна происходит с чертежом. Это просто призыв к
spriteBatch.draw(texture, getLeft(), getBottom(), getWidth(), getHeight());
Я использую шейдер по умолчанию, текстуры упакован с предварительно умноженным альфа с функцией смеси, установленной в
spriteBatch.setBlendFunction(GL20.GL_ONE, GL20.GL_ONE_MINUS_SRC_ALPHA);
Это реальное изображение, хотя альфа не умножается, как это сделанный моим упаковщиком.
Кто-нибудь знает возможную причину этого и как я могу решить это?
Update
Это только кажется происходит при использовании режима смешивания GL20.GL_ONE, GL20.GL_ONE_MINUS_SRC_ALPHA
Другой Update
Я попытался изменить всю игру, чтобы использовать не альфа текстуры предварительно умноженные. Я использую Texture Packer, который может помочь устранить проблемы с ореолом, которые часто возникают с непремультиплексной альфа. Все это прекрасно работает в Android и Desktop версии. В версии WebGL, когда я получаю плавные градиенты, я все равно получаю небольшой эффект ореола, поэтому я не могу использовать это как решение.
И еще одно обновление
Вот новый образ. Настольная версия сверху, веб-версия внизу.режим GL20.GL_ONE, GL20.GL_ONE_MINUS_SRC_ALPHA
слева и GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA
Blending на правой
Вот увеличенная версия левого нижнего изображения выше, с повышенным контрастом, чтобы показать проблему.
Я также сделал много играл с пиксельным шейдером, чтобы попытаться выяснить, что происходит. Если я устанавливаю
gl_FragColor = vec4(c.a, c.a, c.a, 1.0);
то градиент является гладким, но если я устанавливаю
gl_FragColor = vec4(c.r, c.r, c.r, 1.0);
Тогда я получаю полосатость. Это указывает на точную проблему, которую я считаю, поскольку цветовые каналы были сжаты в более темный конец спектра посредством процесса предварительного умножения.
Какой формат текстуры вы используете и каков ваш формат фреймбуфера? RGBA8 несжатый? – solidpixel
@ Isogen74 Да, RGBA8 несжатый. –
вы уверены, что цель альфа-1 полностью? webgl будет совмещаться со страничным фоном в качестве предварительной альфа-версии. Чтобы быть уверенным, просто очистить альфа до 1 до blit. – starmole