我最近一直在使用 VR,遇到了一些与 OpenGL 相关的问题。我用于 VR 的 API 捕获视频流并将其写入纹理,然后我想将此纹理提交给耳机。但是 API 中存在不兼容:我从流中获取的纹理具有未定义的内部格式,无法直接提交给耳机。
我正在研究一种解决方法,目前,我使用了 GPU -> CPU -> GPU 传输:我读取第一个纹理像素(使用 glReadPixels)并将它们写入缓冲区,然后我使用此缓冲区创建纹理正确的格式。这工作正常,但由于数据传输而有一些延迟。
我一直在尝试直接进行 GPU 复制,但失败了:
我尝试使用 PBO,但遇到无效操作问题(按照http://www.songho.ca/opengl/gl_pbo.html),这里是 glReadPixels 上操作无效的代码
// Initialization glGenBuffers(1, &pbo); glGenTextures(1, &dstTexture); glBindTexture(GL_TEXTURE_2D, dstTexture); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); glBindTexture(GL_TEXTURE_2D, 0); // Copy to GPU glBindBuffer(GL_PIXEL_PACK_BUFFER, pbo); glBufferData(GL_PIXEL_PACK_BUFFER, bufferSize, NULL, GL_DYNAMIC_DRAW); glBindTexture(GL_TEXTURE_2D, id); // texture given by the API glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, NULL); glBindTexture(GL_TEXTURE_2D, 0); glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo); glBufferData(GL_PIXEL_UNPACK_BUFFER, bufferSize, NULL, GL_DYNAMIC_READ); glBindTexture(GL_TEXTURE_2D, dstTexture); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
我尝试使用 FBO,但遇到指针异常。
- glCopyImageSubData 不起作用,因为第一个纹理内部格式无法识别。
进行直接 GPU 复制的步骤是什么?