значение выборки текстуры из пиксельного формата DisparityFloat16 на iOS OpenGLES - PullRequest
0 голосов
/ 05 марта 2019

Я хочу использовать глубину DataMap в качестве текстуры от камеры истинной глубины iPhoneX в моем проекте OpenGLES.Похоже, что вы скачали несколько образцов Swift, можно создать и опробовать глубину карты как текстуру с плавающей точкой на Metal.Но в OpenGLES единственный способ создать текстуру глубины из буфера глубины -

glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, depthWidth, depthHeight, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, CVPixelBufferGetBaseAddress(depthBuffer));

. Значение образца отличается от значения, экспортируемого как CIImage из пиксельного типа DisparityFloat16.Значение намного ниже, а не линейный масштаб по сравнению с CIImage.

Это значение выборки в OpenGLES enter image description here

Это через код: CIImage * image = [CIImage imageWithCVImageBuffer: deepData.depthDataMap];

enter image description here

У кого-нибудь есть такая же проблема?

1 Ответ

0 голосов
/ 09 марта 2019

Похоже, вы указываете тип данных пикселей как GL_UNSIGNED_SHORT, попробуйте изменить его на GL_HALF_FLOAT (при использовании DisparityFloat16) или GL_FLOAT (при использовании DisparityFloat32).

Кроме того, если вы хотите отобразитьГлубина буфера в качестве текстуры, вы должны преобразовывать данные глубины в значения, которые что-то значат на изображении в градациях серого.Если вы нормализуете значения буфера глубины, чтобы они были целыми числами от 0 до 255. Ваше изображение будет выглядеть намного лучше.

Для получения дополнительной информации, У Apple есть примеры именно этой вещи .Они используют Металл, но директор будет работать и с OpenGL. Вот действительно хороший учебник с примером кода, который также делает это.

...