#unity3d #textures #orbbec
Вопрос:
Я работаю с датчиком глубины (Orbbec Astra Pro) и хочу отображать инфракрасное изображение в единстве. Данные, которые я получаю, являются ushort[]
(или любым другим типом, размер которого превышает 8 бит).
Таким образом , я могу создать одноканальную 16-битную текстуру infraredTexture = new Texture2D(infraredFrame.Width, infraredFrame.Height, TextureFormat.R16, false);
, но я не знаю, как заполнить текстуру инфракрасными данными, так как LoadRawTextureData
требуется только byte[]
операционная IntPtr
система .
Поэтому, в конце концов, я хотел бы видеть текстуру в 16-битных оттенках серого в Unity. Возможно ли это вообще? Заранее благодарю вас!
Ответ №1:
В общем примечании от TextureFormat.R16
В настоящее время этот формат текстуры полезен только для плагинов среды выполнения или собственного кода, так как для этого формата не поддерживается импорт текстур.
Обратите внимание, что не все видеокарты поддерживают все форматы текстур, используйте SystemInfo.SupportsTextureFormat для проверки.
У меня нет прямого решения для того, хотите ли вы на самом деле использовать R16
текстуру формата, кроме как каким — то образом сериализовать данные byte[]
, например, с помощью Buffer.BlockCopy
—ПРИМЕЧАНИЕ: это вообще не сработает!
ushort[] yourData = // wherever you get this from;
byte[] byteData = new byte[sizeof(ushort) * yourData.Length];
// On memory level copy the bytes from yourData into byteData
Buffer.BlockCopy(yourData, 0, byteData, 0, byteData.Length);
infraredTexture = new Texture2D(infraredFrame.Width, infraredFrame.Height, TextureFormat.R16, false);
infraredTexture.LoadRawTextureData(byteData);
infraredTexture.Apply();
Опять же, понятия не имею, работает ли это таким образом.
Однако я думаю, что вы могли бы просто «подделать» это в Единстве. Если это в любом случае только для отображения текстуры, вы могли бы использовать «обычную» RGB24
текстуру и просто отобразить свои 16-битные одноканальные данные в 24-битный RGB-цвет серой шкалы, а затем применить его Texture2D.SetPixels
, например,
ushort[] yourData = // wherever you get this from;
var pixels = new Color[yourData.Length];
for(var i = 0; i < pixels.Length; i )
{
// Map the 16-bit ushort value (0 to 65535) into a normal 8-bit float value (0 to 1)
var scale = (float)yourData[i] / ushort.MaxValue;
// Then simply use that scale value for all three channels R,G and B
// => grey scaled pixel colors
var pixel = new Color(scale, scale, scale);
pixels[i] = pixel;
}
infraredTexture = new Texture2D(infraredFrame.Width, infraredFrame.Height, TextureFormat.RGB24, false);
// Then rather use SetPixels to apply all these pixel colors to your texture
infraredTexture.SetPixels(pixels);
infraredTexture.Apply();
Комментарии:
1. Спасибо за предложения 🙂 Я проверю их позже.