Значение выборки текстуры из пиксельного формата DisparityFloat16 на iOS OpenGLES

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

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

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

Это выборочное значение в OpenGLES

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

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

1 ответ

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

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

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

Другие вопросы по тегам