如何向HTC Vive提交纹理?

时间:2017-01-10 13:49:04

标签: opengl openvr htc-vive

我一直在尝试使用合成器向HTC Vive提交纹理。我一直得到105个错误,即“TextureUsesUnsupportedFormat”。纹理是24位深度的bmp图像。我看了一下hellovr样本,仍然有点困惑。我还看到Vive需要一个RGBA8格式的纹理,但不知道如何实际制作一个。我试图让纹理填满每个Eye端口。

我做错了什么?

这是我的代码,用于检索纹理和纹理ID:

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);

2 个答案:

答案 0 :(得分:1)

您可能需要先创建一个具有正确RGBA8格式的曲面,如本答案中所述:https://gamedev.stackexchange.com/a/109067/6920

  

使用精确图像创建临时曲面(SDL_CreateRGBSurface)   您想要的格式,然后将Loading_Surf复制到该临时表面上   (SDL_BlitSurface)

答案 1 :(得分:0)

RGBA8需要32位。您的位图只有24位。似乎缺少alpha个频道。

尝试将其复制到一个更大的容器中,每个像素4x8-bit = 32位(在c ++中,您可以使用char,或者使用某些图像库)。

或者你想要用RGB8纹理为你的设备提供这样的东西(玩OpenGL)。

这可以帮助您https://www.khronos.org/opengl/wiki/Texture