cuda与opengl互操作之PBO

PBO(像素缓冲区对象)也可以映射到CUDA地址空间,CUDA的kernel函数可以讲计算结果直接写到PBO中,然后将 PBO的内容复制到texture,进行绘制。

具体使用步骤:

1、创建PBO

 // Generate a buffer ID called a PBO (Pixel Buffer Object)
 glGenBuffers(1,pbo);
 // Make this the current UNPACK buffer (OpenGL is state-based)
 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);

2、注册PBO

struct cudaGraphicsResource *cuda_pbo_resource;
cudaGraphicsGLRegisterBuffer(&cuda_pbo_resource, *pbo, cudaGraphicsMapFlagsWriteDiscard);

3、映射PBO

cudaGraphicsMapResources(1, &cuda_pbo_resource, 0);
cudaGraphicsResourceGetMappedPointer((void**)&d_output, &num_bytes, cuda_pbo_resource);


4、使用

launch_kernel(d_output, window_width, window_height, w);

5、解除映射

cudaGraphicsUnmapResources(1, &cuda_pbo_resource, 0);

6、解除注册

cudaGraphicsUnregisterResource(cuda_pbo_resource);

7、删除PBO

glBindBuffer(GL_ARRAY_BUFFER, *pbo);
glDeleteBuffers(1, pbo);

8、绘制

glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo);

glBindTexture(GL_TEXTURE_2D, textureID);

glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 128, 128,/*window_width, window_height,*/ 
		GL_RGBA, GL_UNSIGNED_BYTE, NULL);

glBegin(GL_QUADS);
glTexCoord2f(0.0f,1.0f); glVertex3f(0.0f,0.0f,0.0f);
glTexCoord2f(0.0f,0.0f); glVertex3f(0.0f,1.0f,0.0f);
glTexCoord2f(1.0f,0.0f); glVertex3f(1.0f,1.0f,0.0f);
glTexCoord2f(1.0f,1.0f); glVertex3f(1.0f,0.0f,0.0f);
glEnd();

代码:

//myPBO.cpp

#include <gl/glew.h>
#include <cuda_runtime.h>
#include <cutil_inline.h>
#include <cutil_gl_inline.h>
#include <cutil_gl_error.h>
#include <rendercheck_gl.h>
#include <sdkHelper.h>

extern void initCuda(int argc, char **argv);
extern void runCuda();


unsigned int window_width = 500;
unsigned int window_height = 500;
unsigned int image_width = 128;//window_width;
unsigned int image_height = 128;//window_height;
unsigned int timer = 0;

int animFlag = 1; 
float animTime = 0.0f;
float animInc = 0.1f;

GLuint pbo = NULL;
GLuint textureID = NULL;

struct cudaGraphicsResource *cuda_pbo_resource;

extern "C" void launch_kernel(uchar4* , unsigned int, unsigned int, float);

void createPBO(GLuint *pbo)
{
	if (pbo)
	{
		int num_texels = image_width * image_height;
		int num_values = num_texels * 4
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值