2016-02-12 4 views
7

Я выполняю ту же сцену, используя тот же самый точный код на C++, один раз на свой собственный OpenGL на окнах и один раз с использованием Emscripten в WebGL. Все в сцене выглядит точно так же, кроме случаев, когда я показываю что-то с альфа! = 1.0. Разница выглядит следующим образом: enter image description hereРазница в альфа-визуализации между OpenGL и WebGL

синий цвет куб (0.0, 0.0, 1.0, 0.5)
шейдер используется для визуализации куба не делает ничего, кроме сделать цвет.
Справа, как он выглядит с OpenGL и является ожидаемым результатом, только синий с половиной прозрачности. Слева - как это выглядит с помощью Emscripten + WebGL. Похоже, что цвет, который оказывается на самом деле (0.5, 0.5, 1.0, 0.5)

Функция смесь я использую стандарт:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

Есть ли какая-то разница с альфа в WebGL? Что может быть причиной этого?

+0

... закрыть как не по теме? объясните, пожалуйста, – shoosh

+0

Возможно ли, что это премультипликативная и не-преуммированная альфа-проблема? –

+0

@ WacławJasper Я думал об этом, но я действительно не понимаю, как ... преждевременная альфа-игра сделала бы его темнее, а не ярче, нет? – shoosh

ответ

11

Вы установили, что холст не имеет большого разнообразия?

gl = someCanvas.getContext("webgl", { premultipliedAlpha: false }); 

Значение по умолчанию для WebGL истинно. По умолчанию для большинства приложений OpenGL установлено значение

В дополнение к этому WebGL компонуется с остальной частью страницы. Как минимум, это цвет фона холста или того, что внутри (тело вашего документа).

Чтобы увидеть, если это проблема попробовать установить цвет фона холста, чтобы фиолетовый или что-то, что будет торчать

<canvas ... style="background-color: #F0F;"></canvas> 

или в CSS

canvas { background-color: #F0F; } 

OpenGL приложения редко скомпонованы над чем где так как приложения WebGL эффективно компонуются ВСЕГДА.

Некоторые решения

  • Выключите альфа

    Если вам не нужен альфа в пункт назначения вы можете отключить его

    gl = someCanvas.getContext("webgl", { alpha: false }); 
    

    Теперь альфа будет эффективно 1

  • Установите альфа-1 в конце кадра

    // clear only the alpha channel to 1 
    gl.clearColor(1, 1, 1, 1); 
    gl.colorMask(false, false, false, true); 
    gl.clear(gl.COLOR_BUFFER_BIT); 
    

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

  • Установить цвет фона канвы к черному

    canvas { background-color: #000; } 
    

Если возможно, я бы выбрал отключение альфа.Причина, по которой альфа отключена, позволяет браузеру отключить смешение при рисовании холста в браузере. Это может быть увеличение скорости на 10-20% или более в зависимости от графического процессора. Нет никакой гарантии, что любой браузер сделает эту оптимизацию, только это можно сделать, тогда как с другими 2 решениями это невозможно или, по крайней мере, гораздо менее вероятно

Смежные вопросы