Сбой во время ChoosePixelFormat в VB6 - PullRequest
0 голосов
/ 30 марта 2012

Мне было поручено поддерживать приложение VB6;У меня есть некоторый опыт работы с OpenGL, но все используют SDL, и этот, похоже, вручную обрабатывает все его контексты.

Программа, похоже, дает сбой при вызове ChoosePixelFormat.Я передаю ненулевой дескриптор.Он работает на большинстве систем, так что я предполагаю, что это проблема с графическим драйвером, но, похоже, она актуальна.

Кто-нибудь знает, почему эта функция вылетает, а не, скажем, возвращает код ошибки?Я понимаю, что PIXELFORMATDESCRIPTOR может иметь значения, которые не существуют в данной системе:

  .nSize = Len(glPFD)
  .nVersion = 1
  .dwFlags = PFD_DRAW_TO_BITMAP Or PFD_SUPPORT_OPENGL Or PFD_SUPPORT_GDI
  .iPixelType = PFD_TYPE_RGBA
  .cColorBits = 32
  .cDepthBits = 16
  .iLayerType = PFD_MAIN_PLANE

Но может ли это привести к сбою?

Редактировать: В системе, в которой это не удается, онработает с предыдущей версией, в которой этот код был идентичен.Я где-то читал форум, на котором говорилось, что загрузка / выгрузка opengl32.dll может привести к поломке gdi32.dll.Это может иметь место.

Редактировать: я приложил полный код ниже (это уродливо, но это помогло мне сузить, где произошел сбой).Никакие функции не возвращают 0 до сбоя ChoosePixelFormat.

hDCdib = CreateCompatibleDC(0) 'DC compatible with screen

Call MsgBox("Create Compatible DC " + CStr(hDCdib))


'Setup a Device Independent Bitmap Section
With bmInfo.bmiHeader
  .biSize = Len(bmInfo)
  If lngWidth = 0 Then
     .biHeight = objDest.ScaleY(objDest.Height, vbTwips, vbPixels)
     .biWidth = objDest.ScaleX(objDest.Width, vbTwips, vbPixels)
  Else
     .biHeight = objDest.ScaleY(lngHeight, vbTwips, vbPixels)
     .biWidth = objDest.ScaleX(lngWidth, vbTwips, vbPixels)
  End If

  .biPlanes = 1
  .biBitCount = 32
  .biCompression = BI_RGB 'No Compression
  .biSizeImage = 0
  .biClrImportant = 0
  .biClrUsed = 0
  .biXPelsPerMeter = 0
  .biYPelsPerMeter = 0
End With
Call MsgBox("after header")
hDIBSection = CreateDIBSection(hDCdib, bmInfo, DIB_RGB_COLORS, hBitMapData, _
              &O0, &O0)
Call MsgBox("CreateDIBSection" + CStr(hDIBSection))
'Select the DIB into a device context
hBitMapOld = SelectObject(hDCdib, hDIBSection)
Call MsgBox("SelectObject " + CStr(hBitMapOld))
'Create an OpenGL drawing area in that DIB
With glPFD
  .nSize = Len(glPFD)
  .nVersion = 1
  .dwFlags = PFD_DRAW_TO_BITMAP Or PFD_SUPPORT_OPENGL Or PFD_SUPPORT_GDI
  .iPixelType = PFD_TYPE_RGBA
  .cColorBits = 32
  .cDepthBits = 16
  .iLayerType = PFD_MAIN_PLANE
End With
Call MsgBox("glPFD ")
'Ignacio issue is in the next line about ChoosePixelFormat
lngFormat = ChoosePixelFormat(hDCdib, glPFD)
   Call MsgBox("ChoosePixelFormat " + CStr(lngFormat))
Htemp = SetPixelFormat(hDCdib, lngFormat, glPFD)
Call MsgBox("SetPixelFormat " + CStr(Htemp))
hGLrc = wglCreateContext(hDCdib)
Call MsgBox("wglCreateContext " + CStr(hGLrc))
wglMakeCurrent hDCdib, hGLrc
Call MsgBox("wglMakeCurrent ")

1 Ответ

0 голосов
/ 30 марта 2012

Контекст OpenGL в DIB не ускоряется, поэтому вы получите программный рендер (по крайней мере, так было несколько лет назад, и я сомневаюсь, что он изменился, хотя я могу ошибаться).Если вы хотите сделать аппаратно-ускоренный рендеринг, создайте окно и используйте его для генерации контекста GL.Если хотите, скройте окно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...