Столкнулся с такой проблемой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
Класс создания окна Код (Text): Option Explicit 'application Class Private fullscreen As Boolean Private mpos As vec2 Private mcenter As vec2 Private keys(255) As Long '256? ' timer Private frame_time As Double Private frame_interval As Double Private fps_time As Double Private frames As Integer Private hinst As Long Private class_name As String ' window params Private width As Long Private height As Long ' window proc Private hwnd As Long Private hinst_ As Long Private bpp As Long Private hz As Long Private dc As Long Private b As Long Public Sub register() class_name = "OpenGL" Dim wc As WNDCLASSEX With wc .cbSize = LenB(wc) .Style = CS_HREDRAW Or CS_VREDRAW Or CS_OWNDC .lpfnWndProc = msg_headler(AddressOf MsgProc) .hInstance = App.hInstance .lpszClassName = class_name End With RegisterClassEx wc hinst = wc.hInstance End Sub Public Sub create() Dim r As RECT Dim Style As Long Dim ExStyle As Long 'temp width = config.xres height = config.yres bpp = config.bpp hz = config.hz fullscreen = config.fullscreen 'create a window If fullscreen = True Then ExStyle = WS_EX_TOPMOST Or WS_EX_APPWINDOW Style = WS_POPUP GetWindowRect GetDesktopWindow(), r Else ExStyle = WS_EX_APPWINDOW Or WS_EX_WINDOWEDGE Style = WS_OVERLAPPEDWINDOW r.Left = r.Top = CW_USEDEFAULT r.Right = width r.Bottom = height End If hwnd = CreateWindowEx(ExStyle, class_name, "Game Name", Style, r.Left, r.Top, r.Right, r.Bottom, 0&, 0&, hinst, ByVal 0&) ShowWindow hwnd, SW_SHOW UpdateWindow hwnd SetForegroundWindow hwnd SetFocus hwnd 'Hide cursor ShowCursor (True) 'black fill to avoid flickering dc = GetDC(hwnd) b = CreateSolidBrush(RGB(0, 0, 0)) SelectObject dc, b FillRect dc, r, b DeleteObject b ReleaseDC hwnd, dc 'create renderer If rogl_t.create(hwnd, width, height, bpp, hz, fullscreen) = True Then End If With mcenter .x = CSng(width / 2) .y = CSng(height / 2) End With SetCursorPos CLng(mcenter.x), CLng(mcenter.y) End Sub Private Function msg_proc(ByVal uMsg As Long, ByVal wparam As Long, ByVal lparam As Long) As Long Select Case uMsg Case WM_CLOSE PostQuitMessage 0 msg_proc = 0 Case WM_ENTERSIZEMOVE Exit Function Case WM_EXITSIZEMOVE Exit Function Case WM_SIZE Exit Function Case WM_KEYDOWN If wparam = VK_ESCAPE Then PostQuitMessage 0 msg_proc = 0 End If keys(wparam) = 1 msg_proc = 0 Case WM_KEYUP keys(wparam) = 0 msg_proc = 0 Case WM_MOUSEMOVE Dim p As POINTAPI GetCursorPos p If config.fullscreen = False Then ScreenToClient hwnd, p End If mpos.x = CSng(p.x) mpos.y = CSng(p.y) msg_proc = 0 Case default Exit Function End Select msg_proc = DefWindowProc(hwnd, uMsg, wparam, lparam) End Function Private Function MsgProc(ByVal hwnd_ As Long, ByVal msg As Long, ByVal wparam As Long, ByVal lparam As Long) As Long If hwnd_ = hwnd Then MsgProc = msg_proc(msg, wparam, lparam) End If MsgProc = DefWindowProc(hwnd_, msg, wparam, lparam) End Function Public Function msg_headler(ByVal msgh) msg_headler = msgh End Function Класс родключения опенгл rogl_t Код (Text): Option Explicit Private hDC As Long Private hRC As Long 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 PrintConsole "create:" 'go fullscreen if requested If fullscreen = True Then Dim dm As DEVMODE With dm .dmSize = LenB(dm) .dmPelsWidth = width .dmPelsHeight = height .dmBitsPerPel = bpp .dmFields = DM_BITSPERPEL Or DM_PELSWIDTH Or DM_PELSHEIGHT End With End If If hz Then With dm .dmDisplayFrequency = hz .dmFields = DM_BITSPERPEL Or DM_PELSWIDTH Or DM_PELSHEIGHT Or DM_DISPLAYFREQUENCY End With End If If ChangeDisplaySettings(dm, CDS_FULLSCREEN) <> DISP_CHANGE_SUCCESSFUL Then With dm .dmPelsWidth = 640 .dmPelsHeight = 480 .dmBitsPerPel = 16 .dmFields = DM_BITSPERPEL Or DM_PELSWIDTH Or DM_PELSHEIGHT End With 'try again If ChangeDisplaySettings(dm, CDS_FULLSCREEN) <> DISP_CHANGE_SUCCESSFUL Then create = False End If End If SetWindowPos hwnd, HWND_TOPMOST, 0, 0, width, height, SWP_SHOWWINDOW hDC = GetDC(hwnd) If hDC = 0 Then PrintConsole "GetDC() failed" create = False End If Dim pfd As PIXELFORMATDESCRIPTOR With pfd .nSize = Len(pfd) .nVersion = 1 'version .dwFlags = PFD_DRAW_TO_WINDOW Or PFD_SUPPORT_OPENGL Or PFD_DOUBLEBUFFER .iPixelType = PFD_TYPE_RGBA .cColorBits = bpp .cDepthBits = 24 .iLayerType = PFD_MAIN_PLANE End With Dim pix_fmt As Long pix_fmt = ChoosePixelFormat(hDC, pfd) If pix_fmt = 0 Then create = False End If if SetPixelFormat(hdc, pix_fmt, pfd) = False then create = False hRC = wglCreateContext(hDC) If hRC = 0 Then create = False End If If wglMakeCurrent(hDC, hRC) = False Then create = False End If End Function
_vi_ Basic это да... Пол литра в студию!)) ChoosePixelFormat вернул нормальное значение, значит все ок. Что у тебя после нее скажет GetLastError? Попробуй убрать это: И еще попробуй Заменить на
ето хорошо это плохо ( пипец GetLastError возвращает 2000 ( что значит неверный формат пикселя, я вообще уже нече не понимаю О_О убрал - непомогает (да и врятли в этом проблема ведь я вызвал ReleaseDC hwnd, dc, а он всю ету чушь анулирует (можно было конечно и потом закрасить окно, но хотелось именно тут )) а так разе мона - ругается на несоответствие типов SetPixelFormat(hdc, pix_fmt, ByVal 0) вобщем просто ужас (хотел другое слово вставить)
_vi_ Да... странно. Попробуй поставить все же cColorBits = 32, а не 16. Ну всмысле нулевой указатель туда передать. Какой там синтАксис в басике для указателей, я незнаю. Ну и попробуй так же с нулем потыкать другие форматы (10 например). Если заработает - значит надо отнестись более внимательно к структуре PIXELFORMATDESCRIPTOR.
Плтыркал )) все одно. Попробую еще погуглить (т.к. находил много подобных тем, но конкретного решения вигвам)) * /\ / \ __/__/\_\___
_vi_ Странно все это. Скачай любой тутор по OpenGL с подобной инициализацией и посмотри что там и как. Попробуй посмотреть какой-нибудь урок с http://nehe.gamedev.net/
DDDDD ты меня ночью разбуди я те все ети туторы раскажу DDD , у них же название народный учебник , можно добавить - настольный , тоесть всегда под рукой (защищает днём и ночью как олвэйв) , ну, думаю придется много экспериментировать и гуглить, прежде чем нужный мне код заработает (((, а так спасибо конечно за помощь !
ГГ давно мя тут небыло =) проблему решил. Перешел на PowerBasic - повторил точно такой же код и эта несчастная фукция возвратила таки мне 1. Отсюда вывод ВБ - ужас. ну че ему надо было то =(
_vi_ Да х. его з. Видимо он какие-то свойства или действия делает неявными - иного объяснения не вижу.
Врятли, еслиб все нормально было хотябы список расширений бы отобразился или триугольничег нарисовался а тут фигу, и вобще я решил движок в длл засунуть. и отсюда первая хохма набрал кучу кода стал проверять на работоспособность рисованием кубика, и тут на тебе фиг - ну все перерыл, дебаг задымился - уже руки опустил - и тут случайно заметил что по глупости своей вселенской забыл SwapBuffers =)