VC++ MFC单文档应用程序SDI下调用glGenBuffersARB(1, pbo)方法编译通过但执行时出错原因分析及解决办法:glewInit()初始化的错误...
1、問題癥狀
在VC++環境下,利用MFC單文檔應用程序SDI下開發OpenGL程序,當調用glGenBuffersARB(1, &pbo)方法編譯通過但執行時出錯,出錯代碼如下:
OpenGL程序中的0x00000000 處未處理的異常: 0xC0000005: 讀取位置 0x00000000 時發生訪問沖突 void createVBO(GLuint *vbo,int size) {glGenBuffers(1,vbo);//該行代碼出錯,嗚嗚glBindBuffer(GL_ARRAY_BUFFER,*vbo);glBufferData(GL_ARRAY_BUFFER,size,0,GL_DYNAMIC_DRAW);glBindBuffer(GL_ARRAY_BUFFER,0);CUT_CHECK_ERROR_GL(); }是一個建立緩沖區函數的代碼,程序編譯沒有錯誤,但是運行到glGenBuffers(1,vbo)時,出現標題的錯誤,如下圖所示:
2、原因分析
關于緩沖區的一些GL接口,是從GL1.5才開始有的,而windows自帶的GL只支持到1.1版本。但如果你的顯卡支持GL1.5以上的話,glew就很好的幫你完成了擴展工作,既然你用glew,那么就應該在使用GL任何一個接口前首先調用glewInit來初始化這些擴展,否則那些GL接口都不能使用。在你的init方法開頭添加加glewInit就可以了。
3、解決辦法
(1)、Win32工程環境
先按如下代碼初始化
?
//設置OpenGL環境 void SetupGL(int argc, char** argv) {glutInit(&argc, argv);glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);glutInitWindowSize (WINDOW_WIDTH, WINDOW_HEIGHT); glutCreateWindow(ProgramName);glutDisplayFunc(display);glutKeyboardFunc(keyboard);glutReshapeFunc(reshape);glutIdleFunc(idle);glewInit();//glew初始化 }?
然后再調用下面的產生緩沖區標識的代碼:
glGenBuffers(1,vbo);//產生緩沖區標識?(2)、VC++ MFC單文檔應用程序SDI下工程環境
在VC++ MFC單文檔應用程序SDI下工程環境下,需要先調用wglMakeCurrent(m_hDC, tempContext);方法,然后再調用glew初始化代碼,最后再調用產生緩沖區標識的代碼。如果未在wglMakeCurrent之后調用glewInit方法,則會造成glewInit返回1(成功返回0)。從而導致前面的運行時問題出現。下面給出調用次序:
CRSQuickLookView::OnCreate--_>GLInit()--->GetSafeHdc()--->ChoosePixelFormat(m_hDC, &pfd)--->SetPixelFormat(m_hDC, PixelFormat, &pfd)--->wglCreateContext(m_hDC)--->wglMakeCurrent(m_hDC, g_p00RC)--->glewInit()--->initGLBuffers()--->glGenBuffers(1,vbo)。其中,GLInit()和initGLBuffers()方法具體定義如下:
?
void CRSQuickLookView::GLInit() {CreateTexturePixel();//產生測試的像素緩沖區數據//m_hDC = ::GetDC(m_hWnd);CDC* clientDC = new CClientDC(this);m_hDC = clientDC->GetSafeHdc();if (m_hDC == NULL)return;static PIXELFORMATDESCRIPTOR pfd = {sizeof(PIXELFORMATDESCRIPTOR),1,PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, //標志PFD_TYPE_RGBA, //顏色模式24, //顏色位數0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0,32, //深度位數0,0,PFD_MAIN_PLANE,0,0, 0, 0};GLuint PixelFormat;if ((PixelFormat = ChoosePixelFormat(m_hDC, &pfd)) == 0)return; //選擇相應像素格式if (!SetPixelFormat(m_hDC, PixelFormat, &pfd))return; //設置像素格式//if ((m_hRC = wglCreateContext(m_hDC)) == NULL)if ((g_p00RC = wglCreateContext(m_hDC)) == NULL)return; //創建著色描述表SetupCUDA();//設置CUDA環境,主要完成最強計算能力顯卡的選擇和設置//GLSetupRC();//if (!wglMakeCurrent(m_hDC, m_hRC)) if (!wglMakeCurrent(m_hDC, g_p00RC))return; //將著色描述表連接到設備描述表int re=glewInit();initGLBuffers(); }?
?
?
void CRSQuickLookView::initGLBuffers() {// create pixel buffer object to store final imageglGenBuffers(1, &pbo);glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo);glBufferData(GL_PIXEL_UNPACK_BUFFER, width * height * sizeof(GLubyte) * 3, pPixelData, GL_DYNAMIC_DRAW);//GL_STREAM_DRAW_ARBglBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);checkCudaErrors(cudaGLRegisterBufferObject(pbo));// create texture for displayglGenTextures(1, &_texture);glBindTexture(GL_TEXTURE_2D, _texture);glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); }?
?
?
參考鏈接:
1、glewInit初始化的錯誤和glewInit初始化的錯誤
2、在mfc下使用opengl中的vbo進行繪制,繪制失敗
3、OpenGL程序中的0x00000000 處未處理的錯誤: 0xC0000005: 讀取位置 0x00000000 時發生訪問沖突
4、glGenBuffersARB 運行時訪問沖突
5、OpenGL程序中與glew相關的未處理異常的解決方案
?
總結
以上是生活随笔為你收集整理的VC++ MFC单文档应用程序SDI下调用glGenBuffersARB(1, pbo)方法编译通过但执行时出错原因分析及解决办法:glewInit()初始化的错误...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华为交换机配置DHCP服务器
- 下一篇: 阿里巴巴发布首个知识引擎研究计划,联合清