OpenGL-wglCreateContext возвращает 0

Тема в разделе "WASM.OpenGL", создана пользователем _vi_, 24 фев 2007.

  1. _vi_

    _vi_ Денис

    Публикаций:
    0
    Регистрация:
    13 июл 2006
    Сообщения:
    48
    Столкнулся с такой проблемой:dntknw:VB 5.0) wglCreateContext возвращает 0 и поэтому не могу активировать контекст. Рылся в Гугле там сетуют на ошибочные настройки PIXELFORMATDESCRIPTOR-а
    , но етими же настройками все работает в приложениях попроще, а всего лишь добавил изменение настроек экрана с загрузкой из ini файла и регистрацию класса окна, дабы всучить в него процедуру обработки сообщений окошка. Может такое получиться если я раньше вызывал GetDC для закраски окошка с помощью CreateSolidBrush(хотя врятли ведь он был тутже удален ReleaseDC), а только потом для wglCreateContext. Помогите разобраться в чем дело.
    P.S. Все до этой функции работает корректно (нужный пиксельный формат находится и устанасливается)
    P.S.S. настройки
    Dim pfd As PIXELFORMATDESCRIPTOR
    With pfd
    .nSize = Len(pfd)
    .nVersion = 1
    .dwFlags = PFD_DRAW_TO_WINDOW Or PFD_SUPPORT_OPENGL Or PFD_DOUBLEBUFFER
    .iPixelType = PFD_TYPE_RGBA
    .cColorBits = 16
    .cDepthBits = 24
    .iLayerType = PFD_MAIN_PLANE
    End With
     
  2. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Покажи весь код инициализации
     
  3. _vi_

    _vi_ Денис

    Публикаций:
    0
    Регистрация:
    13 июл 2006
    Сообщения:
    48
    Класс создания окна
    Код (Text):
    1. Option Explicit
    2.  
    3. 'application Class
    4. Private fullscreen As Boolean
    5. Private mpos As vec2
    6. Private mcenter As vec2
    7. Private keys(255) As Long '256?
    8. ' timer
    9. Private frame_time As Double
    10. Private frame_interval As Double
    11. Private fps_time As Double
    12. Private frames As Integer
    13. Private hinst As Long
    14. Private class_name As String
    15. ' window params
    16. Private width As Long
    17. Private height As Long
    18. ' window proc
    19. Private hwnd As Long
    20. Private hinst_ As Long
    21. Private bpp As Long
    22. Private hz As Long
    23. Private dc As Long
    24. Private b As Long
    25.  
    26. Public Sub register()
    27. class_name = "OpenGL"
    28. Dim wc As WNDCLASSEX
    29. With wc
    30. .cbSize = LenB(wc)
    31. .Style = CS_HREDRAW Or CS_VREDRAW Or CS_OWNDC
    32. .lpfnWndProc = msg_headler(AddressOf MsgProc)
    33. .hInstance = App.hInstance
    34. .lpszClassName = class_name
    35. End With
    36. RegisterClassEx wc
    37. hinst = wc.hInstance
    38. End Sub
    39. Public Sub create()
    40. Dim r As RECT
    41. Dim Style As Long
    42. Dim ExStyle As Long
    43. 'temp
    44. width = config.xres
    45. height = config.yres
    46. bpp = config.bpp
    47. hz = config.hz
    48. fullscreen = config.fullscreen
    49. 'create a window
    50. If fullscreen = True Then
    51.         ExStyle = WS_EX_TOPMOST Or WS_EX_APPWINDOW
    52.         Style = WS_POPUP
    53.         GetWindowRect GetDesktopWindow(), r
    54. Else
    55.         ExStyle = WS_EX_APPWINDOW Or WS_EX_WINDOWEDGE
    56.         Style = WS_OVERLAPPEDWINDOW
    57.         r.Left = r.Top = CW_USEDEFAULT
    58.         r.Right = width
    59.         r.Bottom = height
    60. End If
    61. hwnd = CreateWindowEx(ExStyle, class_name, "Game Name", Style, r.Left, r.Top, r.Right, r.Bottom, 0&, 0&, hinst, ByVal 0&)
    62. ShowWindow hwnd, SW_SHOW
    63. UpdateWindow hwnd
    64. SetForegroundWindow hwnd
    65. SetFocus hwnd
    66. 'Hide cursor
    67.     ShowCursor (True)
    68. 'black fill to avoid flickering
    69. dc = GetDC(hwnd)
    70. b = CreateSolidBrush(RGB(0, 0, 0))
    71. SelectObject dc, b
    72. FillRect dc, r, b
    73. DeleteObject b
    74. ReleaseDC hwnd, dc
    75. 'create renderer
    76. If rogl_t.create(hwnd, width, height, bpp, hz, fullscreen) = True Then
    77. End If
    78. With mcenter
    79. .x = CSng(width / 2)
    80. .y = CSng(height / 2)
    81. End With
    82. SetCursorPos CLng(mcenter.x), CLng(mcenter.y)
    83. End Sub
    84.  
    85.  
    86.  
    87.  
    88. Private Function msg_proc(ByVal uMsg As Long, ByVal wparam As Long, ByVal lparam As Long) As Long
    89. Select Case uMsg
    90. Case WM_CLOSE
    91.             PostQuitMessage 0
    92.             msg_proc = 0
    93. Case WM_ENTERSIZEMOVE
    94. Exit Function
    95. Case WM_EXITSIZEMOVE
    96. Exit Function
    97. Case WM_SIZE
    98. Exit Function
    99. Case WM_KEYDOWN
    100.             If wparam = VK_ESCAPE Then
    101.                 PostQuitMessage 0
    102.                 msg_proc = 0
    103.             End If
    104.             keys(wparam) = 1
    105.             msg_proc = 0
    106. Case WM_KEYUP
    107.             keys(wparam) = 0
    108.             msg_proc = 0
    109. Case WM_MOUSEMOVE
    110.             Dim p As POINTAPI
    111.             GetCursorPos p
    112.                 If config.fullscreen = False Then
    113.                     ScreenToClient hwnd, p
    114.                 End If
    115.                 mpos.x = CSng(p.x)
    116.                 mpos.y = CSng(p.y)
    117.                 msg_proc = 0
    118. Case default
    119. Exit Function
    120. End Select
    121. msg_proc = DefWindowProc(hwnd, uMsg, wparam, lparam)
    122. End Function
    123. Private Function MsgProc(ByVal hwnd_ As Long, ByVal msg As Long, ByVal wparam As Long, ByVal lparam As Long) As Long
    124. If hwnd_ = hwnd Then
    125. MsgProc = msg_proc(msg, wparam, lparam)
    126. End If
    127. MsgProc = DefWindowProc(hwnd_, msg, wparam, lparam)
    128. End Function
    129. Public Function msg_headler(ByVal msgh)
    130. msg_headler = msgh
    131. End Function
    Класс родключения опенгл rogl_t
    Код (Text):
    1. Option Explicit
    2. Private hDC As Long
    3. Private hRC As Long
    4. Public Function create(ByVal hwnd As Long, ByVal width As Long, ByVal height As Long, ByVal bpp As Long, ByVal hz As Long, ByVal fullscreen As Boolean) As Boolean
    5. PrintConsole "create:"
    6. 'go fullscreen if requested
    7. If fullscreen = True Then
    8. Dim dm As DEVMODE
    9. With dm
    10. .dmSize = LenB(dm)
    11. .dmPelsWidth = width
    12. .dmPelsHeight = height
    13. .dmBitsPerPel = bpp
    14. .dmFields = DM_BITSPERPEL Or DM_PELSWIDTH Or DM_PELSHEIGHT
    15. End With
    16. End If
    17. If hz Then
    18. With dm
    19. .dmDisplayFrequency = hz
    20. .dmFields = DM_BITSPERPEL Or DM_PELSWIDTH Or DM_PELSHEIGHT Or DM_DISPLAYFREQUENCY
    21. End With
    22. End If
    23. If ChangeDisplaySettings(dm, CDS_FULLSCREEN) <> DISP_CHANGE_SUCCESSFUL Then
    24. With dm
    25. .dmPelsWidth = 640
    26. .dmPelsHeight = 480
    27. .dmBitsPerPel = 16
    28. .dmFields = DM_BITSPERPEL Or DM_PELSWIDTH Or DM_PELSHEIGHT
    29. End With
    30. 'try again
    31. If ChangeDisplaySettings(dm, CDS_FULLSCREEN) <> DISP_CHANGE_SUCCESSFUL Then
    32. create = False
    33. End If
    34. End If
    35. SetWindowPos hwnd, HWND_TOPMOST, 0, 0, width, height, SWP_SHOWWINDOW
    36. hDC = GetDC(hwnd)
    37. If hDC = 0 Then
    38.         PrintConsole "GetDC() failed"
    39.         create = False
    40. End If
    41. Dim pfd As PIXELFORMATDESCRIPTOR
    42. With pfd
    43. .nSize = Len(pfd)
    44. .nVersion = 1  'version
    45. .dwFlags = PFD_DRAW_TO_WINDOW Or PFD_SUPPORT_OPENGL Or PFD_DOUBLEBUFFER
    46. .iPixelType = PFD_TYPE_RGBA
    47. .cColorBits = bpp
    48. .cDepthBits = 24
    49. .iLayerType = PFD_MAIN_PLANE
    50. End With
    51. Dim pix_fmt As Long
    52. pix_fmt = ChoosePixelFormat(hDC, pfd)
    53. If pix_fmt = 0 Then
    54. create = False
    55. End If
    56. if SetPixelFormat(hdc, pix_fmt, pfd) = False then create = False
    57. hRC = wglCreateContext(hDC)
    58.     If hRC = 0 Then
    59.                 create = False
    60. End If
    61. If wglMakeCurrent(hDC, hRC) = False Then
    62.         create = False
    63. End If
    64.  
    65. End Function
     
  4. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Что у тебя возарвщвет ChoosePixelFormat?
     
  5. _vi_

    _vi_ Денис

    Публикаций:
    0
    Регистрация:
    13 июл 2006
    Сообщения:
    48
    5
    может дело в
    cColorBits = 16
    .cDepthBits = 24
     
  6. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    _vi_

    Basic это да... Пол литра в студию!))

    ChoosePixelFormat вернул нормальное значение, значит все ок.

    Что у тебя после нее скажет GetLastError?

    Попробуй убрать это:

    И еще попробуй

    Заменить на

     
  7. _vi_

    _vi_ Денис

    Публикаций:
    0
    Регистрация:
    13 июл 2006
    Сообщения:
    48
    ето хорошо
    это плохо (

    пипец GetLastError возвращает 2000 ( что значит неверный формат пикселя, я вообще уже нече не понимаю О_О
    убрал - непомогает (да и врятли в этом проблема ведь я вызвал ReleaseDC hwnd, dc, а он всю ету чушь анулирует (можно было конечно и потом закрасить окно, но хотелось именно тут :) ))
    а так разе мона - ругается на несоответствие типов SetPixelFormat(hdc, pix_fmt, ByVal 0)
    вобщем просто ужас (хотел другое слово вставить)
     
  8. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    _vi_

    Да... странно. Попробуй поставить все же cColorBits = 32, а не 16.

    Ну всмысле нулевой указатель туда передать. Какой там синтАксис в басике для указателей, я незнаю.

    Ну и попробуй так же с нулем потыкать другие форматы (10 например). Если заработает - значит надо отнестись более внимательно к структуре PIXELFORMATDESCRIPTOR.
     
  9. _vi_

    _vi_ Денис

    Публикаций:
    0
    Регистрация:
    13 июл 2006
    Сообщения:
    48
    Плтыркал )) все одно. Попробую еще погуглить (т.к. находил много подобных тем, но конкретного решения вигвам))
    *
    /\
    / \
    __/__/\_\___
     
  10. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    _vi_

    Странно все это. Скачай любой тутор по OpenGL с подобной инициализацией и посмотри что там и как. Попробуй посмотреть какой-нибудь урок с http://nehe.gamedev.net/
     
  11. _vi_

    _vi_ Денис

    Публикаций:
    0
    Регистрация:
    13 июл 2006
    Сообщения:
    48
    DDDDD ты меня ночью разбуди я те все ети туторы раскажу DDD , у них же название народный учебник , можно добавить - настольный , тоесть всегда под рукой (защищает днём и ночью как олвэйв) , ну, думаю придется много экспериментировать и гуглить, прежде чем нужный мне код заработает (((, а так спасибо конечно за помощь !
     
  12. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Ну что, решил проблему?
     
  13. _vi_

    _vi_ Денис

    Публикаций:
    0
    Регистрация:
    13 июл 2006
    Сообщения:
    48
    ГГ давно мя тут небыло =) проблему решил. Перешел на PowerBasic - повторил точно такой же код и эта несчастная фукция возвратила таки мне 1. Отсюда вывод ВБ - ужас. ну че ему надо было то =(
     
  14. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    _vi_

    Да х. его з. Видимо он какие-то свойства или действия делает неявными - иного объяснения не вижу.
     
  15. _vi_

    _vi_ Денис

    Публикаций:
    0
    Регистрация:
    13 июл 2006
    Сообщения:
    48
    Врятли, еслиб все нормально было хотябы список расширений бы отобразился или триугольничег нарисовался а тут фигу, и вобще я решил движок в длл засунуть. и отсюда первая хохма набрал кучу кода стал проверять на работоспособность рисованием кубика, и тут на тебе фиг - ну все перерыл, дебаг задымился - уже руки опустил - и тут случайно заметил что по глупости своей вселенской забыл SwapBuffers =)