Я работаю над проектом 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:
После загрузки текстуры я проверил пиксели с нулевым альфа-каналом, и их значения 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. К сожалению, это не решило проблему.
Кто-нибудь сталкивался с подобными проблемами и знает, как исправить это нежелательное поведение?