在windows7中使用visualstudio2010使用opengl缓冲区时出错



我正在编写CUDA C代码,并尝试使用OpenGL实现模拟数据的可视化。

我正在使用Visual Studio 2010进行开发。

我正在翻阅《CUDA by example》一书,并试图重现书中的例子。因此,在CUDAOpenGL互操作性部分,一切都很好,直到我开始使用glGenBuffers。与缓冲区对象相关的其他函数,如glBindBuffer,在编译过程中也没有识别。我在谷歌上搜索了很多,有很多建议,比如"GL/glext.h",我都试过了。

我还想提到的是,所有头文件(glut.hglew.hglxew.hwglew.h)和lib文件(glut.libglew32.libglew32s.lib)都存在于Visual Studio SDK libinc目录中。VS 2010项目→特性→连接器→输入→附加依赖项我按以下顺序添加了库文件:

cudart.libglut32.libglu32.libglew32.libglew32s.libfreeglut.libopengl32.lib

这是我的程序的源核心供参考

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define GL_GLEXT_PROTOTYPES
#include <GL/gl.h>
#include <GL/glut.h>
#include <GL/freeglut.h>
#include <GL/glew.h>
#include <GL/glext.h>
#include <cuda.h>
#include <cuda_runtime.h>
#include <cutil.h>
#include <cudagl.h>
#include <cuda_gl_interop.h>
#define DIM 512;
GLuint bufferObj;
cudaGraphicsResource *resource;

    void display (void) 
    { 
    glClearColor(1.0f, 0.0f, 0.0f, 1.0f); 
    glClear(GL_COLOR_BUFFER_BIT); 
    glLoadIdentity(); 
    glFlush(); 
    } 
    void reshape (int width, int height) 
    { 
    glViewport(0, 0, (GLsizei)width, (GLsizei)height); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(60, (GLfloat)width / (GLfloat)height, 1.0, 100.0); 
    glMatrixMode(GL_MODELVIEW); 
    } 

    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(512, 512);
    glutInitWindowPosition (100, 100); 
    glutCreateWindow("Bitmap");
    glutDisplayFunc(display); 
    glutReshapeFunc(reshape); 
    glutMainLoop(); 
    glGenBuffers(1,&bufferObj);
    //glBindBuffer()
    }

编译时,我会遇到以下错误:

1> C:ProgramDataNVIDIA CorporationNVIDIA GPU Computing SDK 4.2CcommonincGL/glut.h(574) : see previous definition of 'GLUT_GAME_MODE_DISPLAY_CHANGED'
1>C:ProgramDataNVIDIA CorporationNVIDIA GPU Computing SDK 4.2CcommonincGL/glew.h(84): fatal error C1189: #error : gl.h included before glew.h
1> 
1>C:Program Files (x86)MSBuildMicrosoft.Cppv4.0BuildCustomizatio nsCUDA 4.2.targets(361,9): error MSB3721: The command ""C:Program FilesNVIDIA GPU Computing ToolkitCUDAv4.2binnvcc.exe" -gencode=arch=compute_10,code="sm_10,compute_10" --use-local-env --cl-version 2008 -ccbin "c:Program Files (x86)Microsoft Visual Studio 9.0VCbin" -I"C:ProgramDataNVIDIA CorporationNVIDIA GPU Computing SDK 4.2Ccommoninc" -I"C:Program FilesNVIDIA GPU Computing ToolkitCUDAv4.2include" -G --keep-dir "Debug" -maxrregcount=0 --machine 32 --compile -g -Xcompiler "/EHsc /nologo /Od /Zi /MDd " -o "DebugOPENGL_PRAC_1.cu.obj" "C:UsersumduttaDesktopSANKHA_ALL_MATERIALSPRO GRAMMING_FOLDERCUDA_OPENGL_C2_PRACTICE_PROG_FOLD ER_(OPENGL_PRAC)PROJ_NUM_1_OPENGLPROJ_NUM_1_OPEN GLOPENGL_PRAC_1.cu"" exited with code 2.
1>
1>Build FAILED.

读取错误消息确实很有帮助。你的问题是,你无意识地包含了一堆标题。首先,您只需要glew.h,而不使用glext.h。然后,以正确的顺序包含标题也很重要。

这应该有效:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* GLEW covers everything OpenGL.
   When you use GLEW you do not need any other OpenGL header */
#include <GL/glew.h>
/* GLUT is not part of OpenGL. Either use glut.h or freeglut.h – not both. */
#include <GL/glut.h>
#include <cuda.h>
#include <cuda_runtime.h>
#include <cutil.h>
#include <cuda_gl_interop.h>

BTW:cudagl.h用于旧的、不推荐使用的GL交互API。如果使用cuda_gl_interop.h,则不应使用cudagl.h

最新更新