如何向 HTC Vive 提交纹理?

How to submit textures to the HTC Vive?

我一直在尝试使用合成器向 HTC Vive 提交纹理。我一直收到 105 个错误,即 "TextureUsesUnsupportedFormat"。纹理是一个 24 位深度的 bmp 图像。我看过 hellovr 示例,但仍然有点困惑。我还看到 Vive 需要 RGBA8 格式的纹理,但不确定如何实际制作。我正在尝试让纹理填充每个眼孔。

我做错了什么?

这是我检索纹理和纹理 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);

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

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

或者你想办法为你的设备提供 RGB8 纹理,如果存在类似的东西(玩弄 OpenGL)。

这对你有帮助https://www.khronos.org/opengl/wiki/Texture

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

Create a temporary surface (SDL_CreateRGBSurface) with the exact image format you want, then copy Loading_Surf onto that temporary surface (SDL_BlitSurface)