Three.js устанавливает значения текстуры RGB на ноль, когда ALPHA равен нулю на IOS - PullRequest
0 голосов
/ 01 апреля 2019

Я работаю над проектом WebGL с использованием javascript и фреймворка three.js. Для этого я пишу собственный шейдер с GLSL, в котором мне нужно загрузить несколько таблиц поиска. Это означает, что мне нужно использовать отдельные значения RGBA некоторых текстур для некоторых расчетов, а не отображать их.

Это прекрасно работает на всех устройствах, которые я тестировал. Однако на устройствах iOS (таких как iPad) значения RGB текстуры автоматически устанавливаются в 0, когда ее альфа-канал равен 0. Я не думаю, что это связано с функцией GLSL texture2D, а скорее имеет отношение к трем. JS загружает текстуры на iOS. Я использую встроенный TextureLoader для этого:

var textureLoader = new THREE.TextureLoader();
var lutMap = textureLoader.load('path/to/lookup/table/img.png');
lutMap.minFilter = THREE.NearestFilter;
lutMap.magFilter = THREE.NearestFilter;
lutMap.generateMipmaps = false;
lutMap.type = THREE.UnsignedByteType;
lutMap.format = THREE.RGBAFormat;

Для целей тестирования я создал тестовое изображение с постоянными значениями RGB (255,0,0) и с постоянно уменьшающимся альфа-значением от верхнего правого угла до нижнего левого с альфа-значениями некоторых пикселей, являющимися 0:

Test Image

После загрузки текстуры я проверил пиксели с нулевым альфа-каналом, и их значения R действительно были установлены на 0. Я использовал следующий код для чтения данных изображения:

function getImageData( image ) {

    var canvas = document.createElement( 'canvas' );
    canvas.width = image.width;
    canvas.height = image.height;

    var context = canvas.getContext( '2d' );
    context.drawImage( image, 0, 0 );

    return context.getImageData( 0, 0, image.width, image.height );

}

Странно было то, что это также верно для моего ПК с Windows, но шейдер работает просто отлично. Так что, возможно, это только из-за холста и не имеет ничего общего с реальной проблемой. Однако на устройстве iOS поиск texture2D (...) в коде GLSL действительно вернул (0,0,0,0) именно для этих пикселей. (Обратите внимание, что я пришел из Java / C ++, и я еще не очень знаком с javascript! :)) Я также пытался установить флаг premultipliedAlpha в 0 в экземпляре WebGLRenderer, но также и в самом объекте THREE.ShaderMaterial. К сожалению, это не решило проблему.

Кто-нибудь сталкивался с подобными проблемами и знает, как исправить это нежелательное поведение?

1 Ответ

2 голосов
/ 03 апреля 2019

Код чтения PNG низкого уровня на iOS будет проходить через CoreGraphics и предварительно умножать каждое значение RGB на компонент A для каждого пикселя, поэтому если A = 0, то каждое значение RGB будет равно нулю.Что вы можете сделать, это загрузить изображение 24 BPP, чтобы альфа всегда была 0xFF (иначе 255), но вы не можете отключить этот предварительный шаг в iOS при работе с изображением 32 BPP.

...