Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с инициализацией OpenGL 
V
    Опции темы
Ant
Дата 3.8.2008, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 3.9.2006

Репутация: нет
Всего: нет



Привет. Есть код:

Код

#include <windows.h>
#include <winuser.h>
#include <wingdi.h>
#include <gl\gl.h>
#include <gl\glu.h>

LRESULT CALLBACK WindowProc(HWND hWindow, UINT msg, WPARAM wParam, LPARAM lParam);
void ChangeScreenSettings(BOOL FS);
void EnableOpenGL();
void DisableOpenGL();

int ScreenX, ScreenY;
BOOL FullScreen;
BOOL bQuit = FALSE;
HWND hWnd = 0;
HDC hDC = 0;
HGLRC hRC = 0;
HINSTANCE hInst = 0;


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdName, int nCmdShow){
    hInst = hInstance;
    MSG msg;
    WNDCLASSA wc;
    wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
    wc.lpszMenuName = 0;
    wc.lpszClassName = "OpenGL";
    wc.lpfnWndProc = WindowProc;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIconA(0, IDI_APPLICATION);
    wc.hCursor = LoadCursorA(0, IDC_ARROW);
    wc.hbrBackground = (HBRUSH) 15;
    wc.cbWndExtra = 0;
    wc.cbClsExtra = 0;

    RegisterClassA(&wc);
    ScreenX = GetSystemMetrics(SM_CXSCREEN);
    ScreenY = GetSystemMetrics(SM_CYSCREEN);
    FullScreen = TRUE;
    CreateWindowA("OpenGL", "Window", WS_CLIPCHILDREN | WS_CLIPSIBLINGS |
                        WS_MAXIMIZE | WS_POPUP,
                        0, 0, ScreenX, ScreenY, 0, 0, hInstance, 0);
    EnableOpenGL();
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);
    while(GetMessageA(&msg, 0,0,0)){
        TranslateMessage(&msg);
        DispatchMessageA(&msg);}

    return msg.wParam;
}

LRESULT CALLBACK WindowProc(HWND hWindow, UINT msg, WPARAM wParam, LPARAM lParam){
    switch(msg){
        case WM_CREATE: {
            hWnd = hWindow;
            DEVMODE dm;
            ZeroMemory(&dm, sizeof(DEVMODE));
            dm.dmSize = sizeof(DEVMODE);
            dm.dmPelsWidth = ScreenX;
            dm.dmPelsHeight = ScreenY;
            dm.dmBitsPerPel = 32;
            dm.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
            if (DISP_CHANGE_SUCCESSFUL != (ChangeDisplaySettings(&dm, CDS_FULLSCREEN))){
                MessageBoxA(hWindow, "Ошибка перехода в полноэкранный режим", "Ошибка", MB_OK);
                ExitProcess(0);}
            SetTimer(hWindow, 100, 10, 0);
            return 0;
        }
        case WM_KEYDOWN:{
            switch (wParam){
                case VK_ESCAPE : {
                    SendMessageA(hWnd, WM_CLOSE, 0, 0);}
                    break;
                case VK_SPACE : {
                    //FullScreen = (!FullScreen);
                    //ChangeScreenSettings(FullScreen);
                    break;
                }
            }
            break;
        }
        case WM_TIMER:{
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
            glClearColor(0,0,1,0);
            glLoadIdentity();
            glTranslatef(-1.5, 0, -6.0);
            glBegin(GL_TRIANGLES);
            glColor3f(1,1,1);
            glVertex3f(0, 1, 0);
            glVertex3f(1, 0, 0);
            glVertex3f(0, 0, 1);
            glEnd();
            break;
        }
        case WM_CLOSE: {
            DisableOpenGL();
            PostQuitMessage(0);
        }
    }
    return DefWindowProcA(hWindow, msg, wParam, lParam);
}

void ChangeScreenSettings(BOOL FS){
    if (!FS){
        DisableOpenGL();
        DestroyWindow(hWnd);
        hWnd = CreateWindowA("OpenGL", "Window", WS_OVERLAPPEDWINDOW|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_VISIBLE, 0, 0, ScreenX, ScreenY, 0, 0, hInst, 0);
        EnableOpenGL();
        }

    else {
        DisableOpenGL();
        DestroyWindow(hWnd);
        hWnd = CreateWindowA("OpenGL", "Window", WS_CLIPCHILDREN | WS_CLIPSIBLINGS |
                        WS_MAXIMIZE | WS_POPUP | WS_VISIBLE, 0, 0, ScreenX, ScreenY, 0, 0, hInst, 0);
        EnableOpenGL();
        }
}

void EnableOpenGL(){
    PIXELFORMATDESCRIPTOR pfd;
    ZeroMemory(&pfd, sizeof(pfd));
    pfd.nSize = sizeof(pfd);
    pfd.nVersion = 0;
    pfd.dwFlags = PFD_DRAW_TO_WINDOW |
                  PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
    pfd.iPixelType = PFD_TYPE_RGBA;
    pfd.cColorBits = 32;
    pfd.cDepthBits = 32;
    pfd.iLayerType = PFD_MAIN_PLANE;
    hDC = GetDC(hWnd);
    int PixelFormat = ChoosePixelFormat(hDC, &pfd);
    SetPixelFormat(hDC, PixelFormat, &pfd);
    hRC = wglCreateContext(hDC);
    wglMakeCurrent(hDC, hRC);
}

void DisableOpenGL(){
    wglMakeCurrent(0,0);
    wglDeleteContext(hRC);
    ReleaseDC(hWnd, hDC);
}



Контексты все создаются, но окно остается девственно чистым. Почему так происходит?  smile 
PM MAIL   Вверх
sgi1981
Дата 4.8.2008, 02:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 16.3.2006

Репутация: нет
Всего: 10



1. После включения работы контекста OpenGL необходимо установить ортографическую или перспективную проекцию.
2. После очередного завершения рисования сцены нужно вызывать функцию SwapBuffers(hDC); она меняет местами отображаемый буфер и рисуемый буфер, и тот буфер, в котором происходило рисование до этого - отображается, а тот что отображался до этого - рисуется. Надеюсь ты знаешь что такое двойная буферизация.


--------------------
Тело в нашем пространстве - есть часть пространства, в которой пространство обладает дисторсией относительно внешнего пространства.
PM MAIL   Вверх
Ant
Дата 4.8.2008, 06:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 3.9.2006

Репутация: нет
Всего: нет



Знаю, конечно, спасибо огромное. Добавление glMatrixMode(GL_PROJECTION) в функцию EnableOpenGL помогло. Вопрос снят.  smile 

Это сообщение отредактировал(а) Ant - 4.8.2008, 06:14
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.0555 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.