【发布时间】:2017-10-22 12:13:39
【问题描述】:
我将 CUDA OpenGL 互操作用于灰度图像。我在 CPU 上有一个大小为 imgW x imgH 的灰度图像。我打算将图像复制到 GPU 内存,然后使用 CUDA 更新它。同时,OpenGL 应该渲染更新后的图像。
我有以下有效的代码:
//img: a grayscale image on the CPU
//Allocate Buffer using OpenGL
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, __bufferIdMain);
glBufferData(GL_PIXEL_UNPACK_BUFFER, imgW * imgH * 4, 0, GL_DYNAMIC_COPY); //Must allocate 4 times the memory required, otherwise don't work
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
checkCudaErrors(cudaGraphicsGLRegisterBuffer(&__cudaVboResourceMain, __bufferIdMain, vbo_res_flags));
//Copy grayscale image to GPU memory
checkCudaErrors(cudaGraphicsMapResources(1, &__cudaVboResourceMain, 0));
checkCudaErrors(cudaGraphicsResourceGetMappedPointer((void ** ) &dptr, &num_bytes, __cudaVboResourceMain));
cudaMemcpy(dptr, img, imgW * imgH, cudaMemcpyHostToDevice); //CUDA can use dptr
//Generate Texture from Buffer
glGenTextures(1, &__textureIdMain);
glBindTexture( GL_TEXTURE_2D, __textureIdMain);
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, imgW, imgH, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL);
我的显示功能以及定时器功能只是绘制纹理。代码有效,但我唯一的问题是,调用glBufferData(GL_PIXEL_UNPACK_BUFFER, imgW * imgH * 4, 0, GL_DYNAMIC_COPY); 时需要使用 4 倍以上的内存。我尝试仅使用 imgW * imgH 而不是 imgW * imgH * 4 但不渲染图像。请注意,我只将 imgW * imgH 字节复制到 GPU 内存。有没有办法在 GPU 上使用更少的内存来渲染图像?
【问题讨论】:
-
能否提供更多的数据,例如bufferIdMain和cudaVboResourceMain的配置(VOB代表Vertex Buffer Object吗?)