gpt4 book ai didi

c++ - 4K 纹理流(多分辨率)

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:09:53 25 4
gpt4 key购买 nike

我的目标是使用 OpenGL 以尽可能高的帧速率流式传输 4K 单 channel 图像。这意味着我有 1 个纹理,我将经常用新内容更新它。

至于现在,我正在使用 PBO 来利用 GPU 上的异步纹理下载。代码基本上是:

// EACH TIME TEXTURE NEEDS UPDATE
const int pboSize = 4096 * 4096 * 4;

// Bind PBO to texture data source
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pboHandle);
// Discard data in PBO - already sent to GPU
glBufferData(GL_PIXEL_UNPACK_BUFFER, pboSize, NULL, GL_STREAM_DRAW);
// Map buffer to client memory
float* data = static_cast<float*>(glMapBuffer(GL_PIXEL_UNPACK_BUFFER, GL_WRITE_ONLY));
if (data) {
std::valarray<IMG_PRECISION>& newImageContent = myImageArray[currentImage];
// This seems too slow
std::memcpy(data, &newImageContent[0], newImageContent.size() * sizeof(IMG_PRECISION));
} else {
std::err << "Failed to map PBO to client memory";
}

// Release the mapped buffer
glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER);

const glm::uvec3& dimensions = _texture->dimensions();
_texture->bind();
// Send async to GPU
glTexSubImage2D(
_texture->type(),
0,
0,
0,
GLsizei(dimensions.x),
GLsizei(dimensions.y),
GLint(_texture->format()),
_texture->dataType(),
nullptr
);

// Set back to normal texture data source
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);

这比只使用没有 PBO 的 glTexSubImage() 更快,但还不够快。瓶颈似乎是 std::memcpy,它每帧花费大约 0.0211s。我使用 glTexImage2D() 创建纹理,使用 GL_R16F 作为内部格式,GL_RED 作为格式,GL_FLOAT 作为数据类型.

然而,当纹理非常接近相机时,我真的只需要 4K 分辨率,但在运行时生成 mipmap 似乎太慢了。手动预计算它们也很烦人,因为我在系统 RAM 中已经有很多这样的图像,将 mipmap 与普通图像一起加载在 CPU 端会太慢。

有没有我现在想不到的其他多分辨率方法,或者是使用某些视频编解码器(如 ffmpeg)获得合适帧率的唯一方法?当我从光盘加载这些图像时,我在这些图像中有很多元数据,理想情况下希望避免这种情况。

编辑:Target是使用OpenGL 4.5的跨平台桌面环境

最佳答案

您想避免阻塞。一个线程上传,另一个线程绘制。你应该有多个缓冲区。

这个网站上有一个很好的例子,它在两个缓冲区之间打乒乓球。 http://www.songho.ca/opengl/gl_pbo.html

可以在此处找到更高级的多线程方法。

http://on-demand.gputechconf.com/gtc/2012/presentations/S0356-GTC2012-Texture-Transfers.pdf

关于 Mipmap:如果您不需要它们,请不要生成它们。仅上传 0 级。

补充建议:

  • 将解码器放在另一个线程中。
  • 让解码器在主内存中缓冲几帧,这样上传就不会因等待新帧而饿死。
  • 基准。如果您最终还是阻塞了,PBO 对于您的情况可能不会比 glTexSubImage 快。
  • 注意内部转化。如果内部格式是 GL_RGB 并且 glTexSubImage 显示 GL_BGR(例如),它将在 cpu 上执行另一个拷贝。

关于c++ - 4K 纹理流(多分辨率),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43480786/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com