gpt4 book ai didi

opengl - TBO/VBO/other 用于带有压缩和 mipmap 的 opengl 纹理

转载 作者:行者123 更新时间:2023-12-04 05:21:19 24 4
gpt4 key购买 nike

到目前为止,我已经使用过:

纹理创建:

glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, texture[1]);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 4);
glTexImage2D(GL_TEXTURE_2D, 0,GL_COMPRESSED_RGBA_S3TC_DXT5_EXT , tWidth,Height, 0, GL_RGBA, GL_UNSIGNED_BYTE,Data);
glGenerateMipmap(GL_TEXTURE_2D);

纹理用法:
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, texture[1]);

我正在寻找有效的解决方案来将纹理保存在内存中并在着色器中使用它。
我已经阅读了一些关于 PBO 和 TBO(以及其他一些解决方案)的内容,但是我无法通过压缩和 mipmap 的示例找到它们。
你建议我选择什么?哪个更快?以及它如何与压缩和 mipmap 配合使用?

最佳答案

I thought that by using buffers, the driver has direct access to the data texture, so everything goes faster.



这是你问题的根源。

当您调用 glTexImage2D ,你告诉 OpenGL 到 allocate storage for the texture object .在此调用之后,纹理将存储该图像数据。就像调用 malloc ,仅用于纹理内存。纹理不再尝试从您提供的内存指针中读取(不是在调用之后);您可以(并且通常应该)删除它。纹理现在在内部具有该数据。

And how about changing textures? (eg if all do not fit in memory?)



分配更多内存(您正在谈论的缓冲区对象)不会使其更有可能适合内存。如果你内存不足,你就内存不足;做更多的分配是没有帮助的。

更重要的是,缓冲区对象与纹理存在相同的内存问题。如果驱动程序喜欢它,它会将它们从 GPU 内存中删除。所以你什么也得不到。所以缓冲区对象存储与纹理对象存储没有区别。

最重要的是,PBO 和 TBO 不是那样工作的。

“像素缓冲区对象”不过是 asynchronously copy pixel data into or out of a texture's storage 的一种方式.复制完成后,缓冲区与纹理不再关联。除非您动态修改纹理的内容,否则 PBO 与整体纹理性能几乎没有关系。

Buffer textures是一种使用缓冲区对象作为纹理存储的方法。但是缓冲区纹理是 different texture type ;它们不同于 2D 纹理,就像 2D 纹理不同于 3D 纹理一样。缓冲区纹理不能被 mipmap,不能有数组层,不能有过滤或任何采样参数,只能使用 very limited set of image formats (并且它们都没有被压缩),并且它们只能通过 texelFetch 访问及其同类。它们是一维的(但不是一维纹理)。

缓冲区纹理只不过是着色器直接从 GPU 内存的线性数组中读取的一种方式。您不能简单地用缓冲纹理替换 2D 纹理;你必须重新设计你的着色器和一切。

总而言之,您似乎对 OpenGL 有很多误解。

关于opengl - TBO/VBO/other 用于带有压缩和 mipmap 的 opengl 纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13659428/

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