gpt4 book ai didi

opengl - 是否可以在不先将整个纹理加载到常规 RAM 的情况下将纹理加载到 OpenGL 中?

转载 作者:行者123 更新时间:2023-12-02 20:02:02 24 4
gpt4 key购买 nike

通常,当我们将纹理加载到 OpenGL 中时,我们或多或少会这样做

  • 打开文件
  • 将所有字节读入系统RAM
  • 调用 glTexImage2D() 将字节发送到 VRAM
  • 释放系统内存中的字节

有没有一种方法可以将字节流式传输/加载到 VRAM 中,从而跳过将其全部加载到系统 RAM 的部分。像这样:

char chunk[1000];

f = openfile("some file")

glBindTexture(....)
glTexParameteri(...)
glTexParameteri(...)
glTexParameteri(...)

while (f.eof == false) {
chunk = f.read_chunk(1000);
glTexImage2D..... (here's the chunk)
}
closefile(f);

我想知道是否有一些新的 OpenGL 扩展可以做到这一点。

最佳答案

大多数图像文件格式都经过压缩或大量编码。所以至少它们的某些部分必须首先通过常规系统内存。但是,如果您使用 OpenGL 缓冲区对象,则无需在系统 RAM 中为整个图像分配缓冲区。然而,它最终可能会在 VRAM 中分配缓冲区对象,因此您在那里有两次数据,至少有一段时间

关于如何使用它的悬崖笔记是

size_t buffer_size = ...;
GLuint buffer_id;
glGenBuffers(1, &buffer_id);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, buffer_id);
glBufferData(GL_PIXEL_UNPACK_BUFFER, buffer_size, NULL, GL_STATIC_DRAW);

void *buffer_ptr = glMapBuffer(GL_PIXEL_UNPACK_BUFFER, GL_WRITE_ONLY);
size_t offset_into_buffer = ...;
read_image_pixels_into_buffer((char*)buffer_ptr + offset_into_buffer);
glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER);

glTexImage2D(..., (void*)((uintptr_t)offset_into_buffer));

glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
glDeleteBuffers(1, &buffer_id);

请注意,如果像上面的代码那样天真地使用缓冲区对象,性能和效率可能会受到影响。通常缓冲区对象用作内存池,根据需要从中切割 block ,缓冲区不会经常创建和删除。然而,也有通过缓冲区孤立进行流式传输,这实际上会重新创建缓冲区:https://www.khronos.org/opengl/wiki/Buffer_Object_Streaming

关于@BDL 评论的更新

使用 OpenGL,您实际上无法控制事情 发生的方式,但您可以将采用的代码路径推向某个方向。始终要牢记的一件事是,OpenGL 根本没有内存模型。事情应该以某种方式正常工作。

这样做的副作用是,为了满足要求,基于 GPU 的 OpenGL 实现可能随时被迫将 GPU 内存中的一些数据转移到其他地方。 …最有可能是系统 RAM,但甚至可能是磁盘交换空间。由于现代操作系统倾向于过度使用内存,因此 OpenGL 实现很可能会简单地保留与所有分配的 OpenGL 对象所需的相同数量的实际页面错误内存。对于非流式数据,始终在系统内存(或交换)中保留数据副本非常有意义,因为这会将逐出变成清除一些 VRAM 内存分配条目。

现在在缓冲区对象的情况下,我上面概述的代码路径实际上可以通过缓冲区重命名避免一个额外的副本,即当将数据加载到纹理中时,实际上没有数据被复制,而只是纹理描述符设置为指向缓冲区对象中的特定区域……直到缓冲区中的该区域被覆盖,然后触发副本的创建。然而,在将缓冲区对象(名称)加载到纹理后立即将其删除实际上可能会将缓冲区的整个内存分配给纹理对象。 _然而,这只是一个潜在的优化,OpenGL 实现可以实现,但不是必须。__

整个 OpenGL 规范非常模糊,这使得开发高性能 OpenGL 实现变得异常困难。

关于opengl - 是否可以在不先将整个纹理加载到常规 RAM 的情况下将纹理加载到 OpenGL 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55675520/

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