在我的应用程序中,我需要每帧更新纹理,为了快速完成此操作,我使用 CUDA,也是因为我的初始数据是 24 位 BGR。 所以我用这种方式创建纹理:
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, DimY, DimX, 0, GL_BGR, GL_UNSIGNED_BYTE, NULL);
我使用
cudaGraphicsGLRegisterImage
、cudaGraphicsMapResources
和 cudaGraphicsSubResourceGetMappedArray
来做 cudaMemcpy2DToArrayAsync
,但我在我的电脑上看到它效果不佳,因为纹理实际上是 BGRX8,所以我创建了一个 cuda 内核来转换24 位 BRG 至 32 RGB。我现在想做的是让它通用检查纹理的真实格式,但是我没有找到方法。
有没有办法获得纹理的真实格式?或者 cuda 数组的?
获取纹理对象的有效目标(如果目标未知)
glGetTextureParameteriv(
texture,
GL_TEXTURE_TARGET,
&target
);
获取特定关卡的内部格式
glGetTextureLevelParameteriv(
texture,
mipmaplevel, //e.g. 0
GL_TEXTURE_INTERNAL_FORMAT
&format
);
我特意使用了命名函数,这需要 OpenGL 4.5 版本。但也有
glGetTexParameteriv
和 glGetTexLevelParameteriv
(OpenGL 2+)。