[英]Can only see a single white point CUDA/OpenGL interop
我正在嘗試將C ++代碼轉換為CUDA代碼,該程序將從外部文件讀取數據,然后繪制3D矩陣。 我一次只轉換一些代碼,但我嘗試繪制僅由紅點組成的小型3D矩陣失敗。 我只能看到一個白點,這就是代碼:
#define BUFFER_OFFSET(i) ((char *)NULL + (i))
GLuint bufferObj;
cudaGraphicsResource *resource;
int size=5*5*7;
int window_dim=600;
__global__ void kernel(float4 *ptr, int sizei) {
const unsigned long int blockId = blockIdx.x //1D
+ blockIdx.y * gridDim.x //2D
+ gridDim.x * gridDim.y * blockIdx.z; //3D
const unsigned long int threadId = (blockId * blockDim.x + threadIdx.x);
if(threadId<sizei ) {
ptr[threadId].x=threadIdx.x+0.5f;
ptr[threadId+sizei].x=1.0f;
ptr[threadId].y=blockIdx.y+0.5f;
ptr[threadId+sizei].y=0.0f;
ptr[threadId].z=blockIdx.z+0.5f;
ptr[threadId+sizei].z=0.0f;
ptr[threadId].w=1.0f;
ptr[threadId+sizei].w=1.0f;
}
}
static void key_func( unsigned char key, int x, int y ) {
switch (key) {
case 27:
HANDLE_ERROR( cudaGraphicsUnregisterResource( resource ) );
glBindBuffer( GL_ARRAY_BUFFER, 0 );
glDeleteBuffers( 1, &bufferObj );
exit(0);
}
}
static void draw_func( void ) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluLookAt (2.5f, 2.5f, 10.0f, 2.5f, 2.5f, 3.5f, 0.0f, 1.0f, 0.0f);
glPushMatrix();
glMatrixMode(GL_MODELVIEW);
glBindBuffer( GL_ARRAY_BUFFER, bufferObj );
glVertexPointer( 4, GL_FLOAT, sizeof(float4), 0 );
glColorPointer( 4, GL_FLOAT, sizeof(float4), BUFFER_OFFSET(sizeof(float4)*size) );
glPointSize( 3.0 );
glDrawArrays( GL_POINTS, 0, size);
glFlush();
glPopMatrix();
glutSwapBuffers();
}
static void reshape_func( int w, int h) {
glViewport(0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
glFrustum (-1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 100.0f);
glMatrixMode (GL_MODELVIEW);
glutPostRedisplay();
}
int main( int argc, char **argv ) {
cudaDeviceProp prop;
int dev;
float4 *g_vertex_buffer_data = new float4[size*2];
memset( &prop, 0, sizeof( cudaDeviceProp ) );
prop.major = 3;
prop.minor = 0;
HANDLE_ERROR( cudaChooseDevice( &dev, &prop ) );
HANDLE_ERROR( cudaGLSetGLDevice( dev ) );
glutInit( &argc, argv );
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize( window_dim, window_dim );
glutCreateWindow( "Interop_test" );
glGenBuffers( 1, &bufferObj );
glBindBuffer( GL_ARRAY_BUFFER, bufferObj );
glBufferData( GL_ARRAY_BUFFER, sizeof(float4)*2*size, NULL, GL_DYNAMIC_DRAW );
HANDLE_ERROR( cudaGraphicsGLRegisterBuffer( &resource, bufferObj, cudaGraphicsMapFlagsNone ) );
HANDLE_ERROR( cudaGraphicsMapResources( 1, &resource, NULL ) );
float4 *devPtr;
size_t sizePtr;
HANDLE_ERROR( cudaGraphicsResourceGetMappedPointer( (void**)&devPtr, &sizePtr, resource) );
dim3 dimBlock(5,1,1);
dim3 dimGrid(1,5,7);
kernel<<<dimGrid,dimBlock>>>( devPtr, size );
////////////Don't know if this is necessary/////////////////
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(float4)*size, &devPtr[0].x);
glBufferSubData(GL_ARRAY_BUFFER, sizeof(float4)*size,
sizeof(float4)*size, &devPtr[size].x);
/////////////////////////////////////////////////////////////////
HANDLE_ERROR( cudaGraphicsUnmapResources( 1, &resource, NULL ) );
glEnable(GL_DEPTH_TEST);
glutKeyboardFunc( key_func );
glutDisplayFunc( draw_func );
glutReshapeFunc( reshape_func);
glutMainLoop();
}
我也嘗試打印出devPtr,我得到了正確的數據。
我發現這是問題所在。 我將回答我的問題,以便每個人都可以使用它。 像這樣編輯draw_func:
static void draw_func( void ) {
[...]
glBindBuffer( GL_ARRAY_BUFFER, bufferObj );
glEnableClientState( GL_VERTEX_ARRAY );
glEnableClientState( GL_COLOR_ARRAY );
glVertexPointer( 4, GL_FLOAT, sizeof(float4), 0 );
glColorPointer( 4, GL_FLOAT, sizeof(float4), BUFFER_OFFSET(sizeof(float4)*size) );
glPointSize( 3.0 );
glDrawArrays( GL_POINTS, 0, size);
glDisableClientState( GL_VERTEX_ARRAY );
glDisableClientState( GL_COLOR_ARRAY );
[...]
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.