Необычная ошибка при использовании OpenGL-буферов с Cuda-взаимодействием в MS Visual Studio 2010

Я писал очень простой фрагмент кода, приведенный в книге примеров cuda, которая представляет собой взаимодействие cuda openGL, создающее графику. Программа успешно собирается, но когда я запускаю ее, окно показывает:
Приложение не удалось запустить правильно.
Нажмите кнопку ОК, чтобы закрыть приложение.
Я не знаю, почему это происходит, потому что у меня есть несколько примеров программ cuda, которые успешно работают, а также примеры программ opengl. Я даже запустил пример программы взаимодействия cuda openGL из программы NVidia Sample, которая успешно работает. Здесь я должен упомянуть, что я включил все файлы lib в дополнительные библиотеки, а также включенные файлы в дополнительные каталоги include. Я считаю, что это происходит из-за пиксельных буферов, которые я использую для взаимодействия, потому что нормальные openGL и cuda программы работают нормально. Я должен также упомянуть, что intellisense для Visual Studio показывает API буферов (например, glGenBuffers и т. Д.), Когда я пытаюсь включить их в программу, но после объявления в программе он показывает, что идентификатор не определен с красной линией под ним. , Но этого не происходит в примере кода OpenGL от NVidia.

Я вставляю код ниже:

#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();
}

0

Решение

Не забудь glewInit() до glGenBuffers(),

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector