1

我正在开发一个 opengl 应用程序。我使用了 opengl 函数:glCompressedTexImage2D(),以 ASTC 纹理压缩格式上传视频帧纹理。在GPU支持opengl扩展:GL_KHR_texture_compression_astc_ldr,压缩纹理格式为:GL_COMPRESSED_RGBA_ASTC_8x8_KHR的手机上运行良好,上传时间约为每帧2ms。

我想用opengl 4.5和Nvidia GTX 750硬件将应用程序移植到Windows平台,发现上传成功,但上传时间太长,每帧大约200ms~300ms。我查看了硬件数据库:http ://delphigl.de/glcapsviewer/listreports.php ,发现 GTX 750 不支持GL_KHR_texture_compression_astc_ldr扩展。然后我使用了 Intel(R) HD Graphics 530,它支持GL_KHR_texture_compression_astc_ldr扩展,上传时间约为每帧 2ms。所以我想知道为什么 Nvidia GTX 750 可以成功上传 ASTC 纹理但要花费这么多时间,有没有办法使用 Nvidia GTX 750 在正常时间(每帧 2 毫秒)上传 ASTC 纹理。Intel(R) HD Graphics 530无法支持复杂的 3D 应用程序。

这是上传代码:

glCompressedTexImage2D(GL_TEXTURE_2D,
                                0,
                                compressed_data_internal_format,
                                xsize,
                                ysize,
                                0,
                                n_bytes_to_read,
                                astc_data_ptr);

GL_CHECK(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR));
GL_CHECK(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR));
GL_CHECK(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,     GL_REPEAT));
GL_CHECK(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,     GL_REPEAT));
4

2 回答 2

1

有什么方法可以使用 Nvidia GTX 750 在正常时间(每帧 2 毫秒)上传 ASTC 纹理

如果实现不公开GL_KHR_texture_compression_astc_ldr扩展,则实现不支持 ASTC。因此,无论花费多少时间,您都无法将这些数据上传到它。

当您尝试以它不支持的格式分配纹理存储时,NVIDIA 的驱动程序应该出错了。但不管有没有,优化错误代码是没有意义的。查看错误代码的时间也没有意义。

在进行优化之前,您需要获取应该可以工作的代码。你不应该,除非支持该扩展。

于 2016-03-15T18:27:38.230 回答
0

去过那里.. 使用 ASTC 在移动平台上一切正常。但是当我在 linux 中测试它时(使用 Nvidia Tesla T4 显卡),glCompressedTexImage2D 每帧花费 66 毫秒。仅供参考,没有 glError 或渲染问题。

下面strack显示堆栈调用:

Thread 1 (Thread 0x7fe36885f840 (LWP 22683)):
#0  0x00007fe3619521a4 in ?? () from /lib64/libnvidia-eglcore.so.450.102.04
#1  0x00007fe361971d06 in ?? () from /lib64/libnvidia-eglcore.so.450.102.04
#2  0x00007fe361c7ff23 in ?? () from /lib64/libnvidia-eglcore.so.450.102.04
#3  0x00007fe361f4df01 in ?? () from /lib64/libnvidia-eglcore.so.450.102.04
#4  0x00007fe362010368 in ?? () from /lib64/libnvidia-eglcore.so.450.102.04
#5  0x00007fe362010ec9 in ?? () from /lib64/libnvidia-eglcore.so.450.102.04
#6  0x00007fe361c3814b in ?? () from /lib64/libnvidia-eglcore.so.450.102.04
#7  0x00007fe361c3f4b6 in ?? () from /lib64/libnvidia-eglcore.so.450.102.04
#8  0x0000000000594253 in glCompressedTexImage2D(width=720, height=1280, options=..., internelFormat=37808, bytesToRead=921600, data=0x5ecbe80) at /home/video-dev/Template/NESTImage/header/xxx.hpp:94

似乎驱动程序(/lib64/libnvidia-eglcore.so.450.102.04)处理了这些东西也许驱动程序在CPU端解压ASTC而不是GPU。

于 2022-02-02T08:05:25.343 回答