opengl - 如何使用 Mipmapping 将 CUDA 生成的 PBO 复制到纹理

标签 opengl cuda texture-mapping mipmaps

我正在尝试将 PBO 复制到启用了自动 mipmapping 的纹理中,但似乎只生成了顶级纹理(换句话说,没有发生 mipmapping)。

我正在使用构建 PBO

//Generate a buffer ID called a PBO (Pixel Buffer Object)
glGenBuffers(1, pbo);
//Make this the current UNPACK buffer
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, *pbo);
//Allocate data for the buffer. 4-channel 8-bit image
glBufferData(GL_PIXEL_UNPACK_BUFFER, size_tex_data, NULL, GL_DYNAMIC_COPY);
cudaGLRegisterBufferObject(*pbo);

我正在使用构建纹理

// Enable Texturing
glEnable(GL_TEXTURE_2D);

// Generate a texture identifier
glGenTextures(1,textureID);

// Make this the current texture (remember that GL is state-based)
glBindTexture( GL_TEXTURE_2D, *textureID);

// Allocate the texture memory. The last parameter is NULL since we only
// want to allocate memory, not initialize it
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA_FLOAT32_ATI, size_x, size_y, 0,
GL_RGBA, GL_FLOAT, NULL);

// Must set the filter mode, GL_LINEAR enables interpolation when scaling
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);

稍后在内核中,我使用以下内容修改 PBO:

float4* aryPtr = NULL;
cudaGLMapBufferObject((void**)&aryPtr, *pbo);

//Pixel* gpuPixelsRawPtr = thrust::raw_pointer_cast(&gpuPixels[0]);
//... do some cuda stuff to aryPtr ...

//If we don't unmap the PBO then OpenGL won't be able to use it:
cudaGLUnmapBufferObject(*pbo);

现在,在使用上面生成的纹理绘制到屏幕之前,我调用: (请注意上面的 rtMipmapTex = *textureID 和上面的 rtResultPBO = *pbo)

glEnable(GL_DEPTH);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, rtMipmapTex);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, rtResultPBO);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, canvasSize.x, canvasSize.y, GL_RGBA, GL_FLOAT, NULL);

这一切都工作正常并正确显示纹理。但是,如果我将最后一行更改为

glTexSubImage2D(GL_TEXTURE_2D, 1, 0, 0, canvasSize.x, canvasSize.y, GL_RGBA, GL_FLOAT, NULL);

据我所知,应该向我显示纹理金字塔中的第一层而不是第零层纹理,我只是得到一个空白的白色纹理。

如何从 PBO 复制纹理以触发自动 mipmapping?

谢谢。

最佳答案

我真是个白痴。上面的代码工作完美,问题是

glTexSubImage2D(GL_TEXTURE_2D, 1, 0, 0, canvasSize.x, canvasSize.y, GL_RGBA, GL_FLOAT, NULL);

不会从纹理中选择 mipmap 级别,而是从未进行 mipmap 的 pbo 中选择。相反,您可以使用以下命令显示特定的 mipmap 级别:

glTexEnvi(GL_TEXTURE_FILTER_CONTROL,GL_TEXTURE_LOD_BIAS, 4);

关于opengl - 如何使用 Mipmapping 将 CUDA 生成的 PBO 复制到纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3883790/

相关文章:

java - 如何删除颜色(使其透明)从 OpenGL 中的像素获取颜色

opengl - 在 Go 中使用 OpenGL

c# - 如何为 Mesh3D 正确设置纹理坐标

javascript - THREE.js 几何图不出现

java - 使用 png 纹理时使用 opengl(通过 lwjgl)的混合问题

c++ - 如果 CPU 使用率不是 100%,鼠标坐标就会滞后——真的很奇怪!

cuda - 如何为 CUDA 驱动程序 API 库实现句柄?

random - CUDA CURAND 是否容易受到数据争用的影响?

c - 带有 CUDA 的 Nvidia GPU 上的良性数据竞争条件资格?

three.js - A-Frame THREE.TextureLoader 加载看起来被粉刷过的纹理