在我的应用程序中,我需要每帧更新一个纹理,为了做到这一点,我使用CUDA非常快,也因为我的初始数据是24位BGR。
我这样创建了一个纹理:
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, DimY, DimX, 0, GL_BGR, GL_UNSIGNED_BYTE, NULL);
字符串
然后我使用cudaGraphicsGLRegisterImage
,cudaGraphicsMapResources
和cudaGraphicsSubResourceGetMappedArray
来做一个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(®isteredTex, texture, GL_TEXTURE_2D, cudaGraphicsRegisterFlagsNone));
CUDACK(cudaGraphicsMapResources(1, ®isteredTex, 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位的图形卡。我可以获得有关纹理真实的存储的信息吗?我希望现在更清楚了。
1条答案
按热度按时间hgb9j2n61#
获取纹理对象的有效目标(如果目标未知)
字符串
获取特定级别的内部格式
型
我故意使用命名函数,这需要OpenGL版本4.5。但也有
glGetTexParameteriv
和glGetTexLevelParameteriv
(OpenGL 2+)。参考: