获取真实的OpenGL纹理格式

f4t66c6m  于 2024-01-07  发布在  其他
关注(0)|答案(1)|浏览(222)

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

  1. 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数组的格式?

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

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


然后将其Map到CUDA:

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


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

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


颜色不正确:

而不是

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

hgb9j2n6

hgb9j2n61#

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

  1. glGetTextureParameteriv(
  2. texture,
  3. GL_TEXTURE_TARGET,
  4. &target
  5. );

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

  1. glGetTextureLevelParameteriv(
  2. texture,
  3. mipmaplevel, //e.g. 0
  4. GL_TEXTURE_INTERNAL_FORMAT
  5. &format
  6. );


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

参考:

展开查看全部

相关问题