cuda解码 opengl 显示,CUDA / OpenGL互操作,用CUDA绘制到OpenGL纹理

I am writing a rendering system in CUDA and want results to be quickly displayed via OpenGL, without touching main memory. I basically do the following:

Create and initialize OpenGL texture, and register it in CUDA as cudaGraphicsResource

GLuint viewGLTexture;

cudaGraphicsResource_t viewCudaResource;

void initialize() {

glEnable(GL_TEXTURE_2D);

glGenTextures(1, &viewGLTexture);

glBindTexture(GL_TEXTURE_2D, viewGLTexture);

{

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, view.getWidth(), view.getHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);

}

glBindTexture(GL_TEXTURE_2D, 0);

cudaGraphicsGLRegisterImage(&viewCudaResource, viewGLTexture, GL_TEXTURE_2D, cudaGraphicsRegisterFlagsWriteDiscard)

}

Whenever view is resized I resize viewport and texture image appropriately:

void resize() {

glViewport(0, 0, view.getWidth(), view.getHeight());

glBindTexture(GL_TEXTURE_2D, viewGLTexture);

{

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, view.getWidth(), view.getHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);

}

glBindTexture(GL_TEXTURE_2D, 0);

}

And then each frame I map graphicsResource as a cudaSurfaceObject via cudaArray, call rendering kernel on it, unmap and synchronize to let OpenGL draw a fullscreen quad with this texture:

void renderFrame() {

cudaGraphicsMapResources(1, &viewCudaResource);

{

cudaArray_t viewCudaArray;

cudaGraphicsSubResourceGetMappedArray(&viewCudaArray, viewCudaResource, 0, 0);

cudaResourceDesc viewCudaArrayResourceDesc;

{

viewCudaArrayResourceDesc.resType = cudaResourceTypeArray;

viewCudaArrayResourceDesc.res.array.array = viewCudaArray;

}

cudaSurfaceObject_t viewCudaSurfaceObject;

cudaCreateSurfaceObject(&viewCudaSurfaceObject, &viewCudaArrayResourceDesc);

{

invokeRenderingKernel(viewCudaSurfaceObject);

}

cudaDestroySurfaceObject(viewCudaSurfaceObject));

}

cudaGraphicsUnmapResources(1, &viewCudaResource);

cudaStreamSynchronize(0);

glBindTexture(GL_TEXTURE_2D, viewGLTexture);

{

glBegin(GL_QUADS);

{

glTexCoord2f(0.0f, 0.0f); glVertex2f(-1.0f, -1.0f);

glTexCoord2f(1.0f, 0.0f); glVertex2f(+1.0f, -1.0f);

glTexCoord2f(1.0f, 1.0f); glVertex2f(+1.0f, +1.0f);

glTexCoord2f(0.0f, 1.0f); glVertex2f(-1.0f, +1.0f);

}

glEnd();

}

glBindTexture(GL_TEXTURE_2D, 0);

glFinish();

}

The problem is: Whenever view is resized all CUDA calls start spewing out "unknown error"s and visually it looks like the texture is not in fact resized, just stretched across the whole view. Why is this happening and how do I fix it?

解决方案

It seems interop requires to re-register textures upon resize. The following works:

void resize() {

glViewport(0, 0, view.getWidth(), view.getHeight());

// unregister

cudaGraphicsUnregisterResource(viewCudaResource);

// resize

glBindTexture(GL_TEXTURE_2D, viewGLTexture);

{

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, view.getWidth(), view.getHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);

}

glBindTexture(GL_TEXTURE_2D, 0);

// register back

cudaGraphicsGLRegisterImage(&viewCudaResource, viewGLTexture, GL_TEXTURE_2D, cudaGraphicsRegisterFlagsWriteDiscard);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值