获取真实的OpenGL纹理格式

f4t66c6m  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(154)

在我的应用程序中,我需要每帧更新一个纹理,为了做到这一点,我使用CUDA非常快,也因为我的初始数据是24位BGR。
我这样创建了一个纹理:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, DimY, DimX, 0, GL_BGR, GL_UNSIGNED_BYTE, NULL);

字符串
然后我使用cudaGraphicsGLRegisterImagecudaGraphicsMapResourcescudaGraphicsSubResourceGetMappedArray来做一个cudaMemcpy2DToArrayAsync,但是我在我的PC上看到它工作得不好,因为纹理实际上是一个BGRX8,所以我创建了一个CUDA内核来从24位BRG转换到32 RGB。我现在想做的是让它通用检查纹理的真实格式,但是我还没有找到一种方法。有一种方法可以得到纹理的真实的格式吗?或者cuda数组的格式?

编辑尝试添加更多信息,我这样创建纹理:

glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, Dx,Dy, 0, GL_BGR, GL_UNSIGNED_BYTE, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);


然后将其Map到CUDA:

CUDACK(cudaGraphicsGLRegisterImage(&registeredTex, texture, GL_TEXTURE_2D, cudaGraphicsRegisterFlagsNone));
CUDACK(cudaGraphicsMapResources(1, &registeredTex, 0));
CUDACK(cudaGraphicsSubResourceGetMappedArray(&mappedArray, registeredTex, 0, 0));


然后更新纹理,如果我这样做:

cudaMemcpy2DToArrayAsync(mappedArray, 0, 0, image_vec, Dx*3, Dx, Dy, cudaMemcpyHostToDevice, stream);


颜色不正确:

而不是

所以,为了正确地显示它,我做了一个内核,将BGR转换为RGBA,它工作,在我的PC上,我问的是,我如何使它在每台PC上工作的方式?也许有一个处理BGR纹理或24位的图形卡。我可以获得有关纹理真实的存储的信息吗?我希望现在更清楚了。

hgb9j2n6

hgb9j2n61#

获取纹理对象的有效目标(如果目标未知)

glGetTextureParameteriv(
    texture,
    GL_TEXTURE_TARGET,
    &target
);

字符串
获取特定级别的内部格式

glGetTextureLevelParameteriv(
    texture,
    mipmaplevel, //e.g. 0
    GL_TEXTURE_INTERNAL_FORMAT
    &format
);


我故意使用命名函数,这需要OpenGL版本4.5。但也有glGetTexParameterivglGetTexLevelParameteriv(OpenGL 2+)。

参考:

相关问题