在MS Visual Studio 2010上使用带有Cuda互操作的OpenGL缓冲区时出现异常错误
Unusual Error Using OpenGL Buffers with Cuda interop on MS Visual Studio 2010
我正在编写一段非常简单的代码,该代码在cuda by example book中给出,即创建图形的cuda openGL interop。该程序正在成功构建,但当我运行该程序时,窗口显示:应用程序无法正确启动。单击"确定"关闭应用程序。我不知道为什么会发生这种情况,因为我很少有成功运行的cuda示例程序以及opengl示例程序。我甚至从正在成功运行的英伟达示例程序中运行示例cuda openGL互操作程序。我应该在这里提到,我已经将所有lib文件都包含在附加库中,并将包含的文件包含在附加include目录中。我相信之所以会发生这种情况,是因为我用于interop的像素缓冲区,因为正常的openGL和cuda程序运行良好。我还应该提到,当我试图将缓冲区API(如glGenBuffers等)包括在程序中时,visualstudiointellisense会显示这些缓冲区,但在程序中声明后,它会显示标识符是未定义的,下面有一条红线。但这件事并没有发生在英伟达示例OpenGL代码中。
我正在粘贴下面的代码:
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>
#include <GL/glew.h>
#include <GL/glut.h>
#include <GL/glaux.h>
#include <cuda.h>
#include <cuda_runtime.h>
#include <cutil.h>
#include <cuda_gl_interop.h>
#define DIM 512
GLuint bufferObj;
cudaGraphicsResource *resource;
// based on ripple code, but uses uchar4 which is the type of data
// graphic inter op uses. see screenshot - basic2.png
__global__ void kernel( uchar4 *ptr ) {
int x = threadIdx.x + blockIdx.x * blockDim.x;
int y = threadIdx.y + blockIdx.y * blockDim.y;
int offset = x + y * blockDim.x * gridDim.x;
// now calculate the value at that position
float fx = x/(float)DIM - 0.5f;
float fy = y/(float)DIM - 0.5f;
unsigned char green = 128 + 127 *
sin( abs(fx*100) - abs(fy*100) );
// accessing uchar4 vs unsigned char*
ptr[offset].x = 0;
ptr[offset].y = green;
ptr[offset].z = 0;
ptr[offset].w = 255;
}
static void key_func( unsigned char key, int x, int y ) {
switch (key) {
case 27:
// clean up OpenGL and CUDA
cudaGraphicsUnregisterResource( resource );
glBindBuffer( GL_PIXEL_UNPACK_BUFFER_ARB, 0 );
glDeleteBuffers( 1, &bufferObj );
exit(0);
}
}
static void draw_func( void ) {
glDrawPixels( DIM, DIM, GL_RGBA, GL_UNSIGNED_BYTE, 0 );
glutSwapBuffers();
}
int main( int argc, char **argv ) {
cudaDeviceProp prop;
int dev;
memset( &prop, 0, sizeof( cudaDeviceProp ) );
prop.major = 1;
prop.minor = 0;
cudaChooseDevice( &dev, &prop );
cudaGLSetGLDevice( dev ) ;
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGBA );
glutInitWindowSize( DIM, DIM );
glutCreateWindow( "bitmap" );
glGenBuffers( 1, &bufferObj );
glBindBuffer( GL_PIXEL_UNPACK_BUFFER_ARB, bufferObj );
glBufferData( GL_PIXEL_UNPACK_BUFFER_ARB, DIM * DIM * 4,NULL, GL_DYNAMIC_DRAW_ARB);
cudaGraphicsGLRegisterBuffer( &resource,
bufferObj,
cudaGraphicsMapFlagsNone ) ;
// do work with the memory dst being on the GPU, gotten via mapping
cudaGraphicsMapResources( 1, &resource, NULL ) ;
uchar4* devPtr;
size_t size;
cudaGraphicsResourceGetMappedPointer( (void**)&devPtr,
&size,
resource) ;
dim3 grids(DIM/16,DIM/16);
dim3 threads(16,16);
kernel<<<grids,threads>>>( devPtr );
cudaGraphicsUnmapResources( 1, &resource, NULL ) ;
glutKeyboardFunc( key_func );
glutDisplayFunc( draw_func );
glutMainLoop();
}
不要忘记在glGenBuffers()
之前使用glewInit()
。
相关文章:
- OpenGL 16 位模板缓冲区?
- 在 openGL 中多次绑定缓冲区
- 是否可以从 OpenGL 缓冲区获取原始大小的像素?
- 是否可以在 OpenGL 中的同一调用中呈现两个具有不同索引起点的不同缓冲区?
- OpenGL 调试上下文警告 -"将使用视频内存作为缓冲区异议的来源
- Opengl 3/4 : 我可以将相同的缓冲区对象绑定到不同的目标吗?
- OpenGL 更新缓冲区如何影响速度
- 从OpenGL应用程序中提取颜色/深度缓冲区
- 使用 OpenGL 插值数据缓冲区?
- 写入渲染缓冲区并使用单个渲染调用使用 OpenGL 显示
- OpenGL 顶点缓冲区类重定义和模板方法错误
- 绘制的 OpenGL 点消失,绘制调用和交换缓冲区问题
- OpenGL:使用指向静态数据的指针数组传递缓冲区数据
- 使用推力使用sort_by_key对两个OpenGL缓冲区进行排序
- OpenGL - 深度缓冲区在渲染半透明立方体时剪切掉不应该剪切的面
- 无法获取索引缓冲区以在 OpenGL 中绘制正方形
- 写入 OpenGL 模具缓冲区
- 如何使用 new 和 delete 与 OpenGL 的缓冲区对象一起使用?
- OpenGL:缓冲区对象/着色器超出范围
- OpenGL-缓冲区更新下一个渲染对象