日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

VC++ MFC单文档应用程序SDI下调用glGenBuffersARB(1, pbo)方法编译通过但执行时出错原因分析及解决办法:glewInit()初始化的错误...

發布時間:2025/3/20 c/c++ 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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()初始化的错误...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。