Как отправить текстуры в HTC Vive?

Пытался передать текстуру в HTC Vive с помощью композитора. Я постоянно получаю 105 ошибок, которые называются «TextureUsesUnsupportedFormat». Текстура - это изображение в формате BMP с глубиной 24 бита. Я посмотрел образец hellovr и все еще немного запутался. Я также видел, что Vive требует формата RGBA8 для текстуры, но не знаю, как это сделать. Я пытаюсь получить текстуру, чтобы заполнить каждый порт Eye.

Что я делаю неправильно?

Вот мой код для получения текстуры и идентификатора текстуры:

Loading_Surf = SDL_LoadBMP("Test.bmp");
Background_Tx = SDL_CreateTextureFromSurface(renderer, Loading_Surf);


if (!Loading_Surf) {

    return 0;
}

glGenTextures(1, &textureid);

glBindTexture(GL_TEXTURE_2D, textureid);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, Loading_Surf->w, Loading_Surf->h, 0, mode, GL_UNSIGNED_BYTE, Loading_Surf->pixels);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

SDL_FreeSurface(Loading_Surf);

SDL_RenderCopy(renderer, Background_Tx, NULL, NULL);
SDL_RenderPresent(renderer);
return textureid;

Отправка кода Vive:

vr::Texture_t l_Eye = { (void*)frameID, vr::API_OpenGL, vr::ColorSpace_Gamma };
std::cout << vr::VRCompositor()->WaitGetPoses(ViveTracked, vr::k_unMaxTrackedDeviceCount, NULL, 0);
error = vr::VRCompositor()->Submit(vr::Eye_Left, &l_Eye);

person Zach    schedule 10.01.2017    source источник


Ответы (2)


Возможно, вам сначала потребуется создать поверхность с правильным форматом RGBA8, как указано в этом ответе: https://gamedev.stackexchange.com/a/109067/6920

Создайте временную поверхность (SDL_CreateRGBSurface) с точным форматом изображения, который вы хотите, затем скопируйте Loading_Surf на эту временную поверхность (SDL_BlitSurface)

person Christopher Bruns    schedule 10.01.2017

RGBA8 требуется 32 бита. В вашем растровом изображении всего 24 бита. Похоже, что alpha каналов отсутствуют.

Попытайтесь скопировать его в контейнер большего размера, имеющий 4x8-bit = 32 бита на пиксель (в C ++ вы можете использовать char или использовать какую-нибудь библиотеку изображений).

Или вы решите накормить свое устройство RGB8 текстурой, если что-то подобное существует (поэкспериментируйте с OpenGL).

Это поможет вам https://www.khronos.org/opengl/wiki/Texture.

person Armen Avetisyan    schedule 10.01.2017