Как указывает @Sergiu, по умолчанию браузер может применять к изображениям коррекцию цвета, гамма-коррекцию, цветовые профили или что-либо еще.
В WebGL вы можете отключить это.Перед загрузкой изображения в текстуру вызовите gl.pixelStorei
с gl.UNPACK_COLORSPACE_CONVERSION_WEBGL
и передайте его gl_NONE
, как в
gl.pixelStorei(gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, gl.NONE);
. Это скажет браузеру не применять цветовые пространства, гамму и т. Д. Это было важнодля WebGL, потому что многие 3D-приложения используют текстуры, чтобы передавать вещи, отличные от изображений.Примеры включают в себя карты нормалей, карты высот, карты окклюзии окружающей среды, карты свечения, карты отражений и многие другие виды данных.
Значение по умолчанию:
gl.pixelStorei(gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, gl.BROWSER_DEFAULT_WEBGL);
Обратите внимание, что это работает, только когдабрать данные непосредственно с изображения, а не при прохождении изображения через 2-й холст.
Обратите внимание, что если вы получаете данные из холста WebGL путем их рисования на 2D-холсте, все ставки отключены.Если ничто иное, Canvas 2D использует предварительно умноженную альфа, поэтому копирование данных в 2D холст и из него всегда происходит с потерями, если альфа <255. Используйте <code>gl.readPixels, если вы хотите, чтобы данные не подвергались влиянию 2D холста.
Обратите внимание, что одной потенциальной проблемой этого метода является скорость.При загрузке изображения браузер, вероятно, предполагает, что оно в конечном итоге будет отображаться.Он не может заранее знать, что он будет использоваться в текстуре.Итак, вы создаете тег изображения, устанавливаете атрибут src, браузер загружает изображение, распаковывает его, подготавливает его к отображению, затем генерирует событие загрузки, затем вы загружаете это изображение в текстуру с помощью UNPACK_COLORSPACE_CONVERSION_WEBGL = NONE
.Браузеру на этом этапе, возможно, придется повторно распаковать его, если он не поддерживает версию, в которой уже не применено преобразование цветового пространства.Это вряд ли заметная проблема со скоростью, но она также не равна нулю.
Чтобы обойти это, браузеры добавили ImageBitmap
api .Этот API-интерфейс решает несколько проблем.
Он может использоваться веб-работником, поскольку он не является элементом DOM, например, Image is
.передайте его под прямоугольником, чтобы вам не нужно было сначала получать все изображение, чтобы получить какую-то часть, если оно
Вы можете указать, применять ли коррекцию цветового пространства доон начинает избегать проблемы, упомянутой выше.
К сожалению, по состоянию на 2018/12 он полностью поддерживается только Chrome.Firefox имеет частичную поддержку.У Safari нет ни одного.