Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Инициализация OpenGL

47K
13 августа 2010 года
9l.
33 / / 04.05.2010
Привет всем, у меня возможно несколько глупый вопрос, почему окно не окрашивается в красный цвет если убрать выделенные строки?

Код:
#include <windows.h>
#include <gl/gl.h>
#include <gl/glu.h>

HWND    Hwnd;
HGLRC   Hglrc;
HDC     Hdc;

void Render()
{
    glClearColor(1.0, 0.0, 0.0, 1.0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    SwapBuffers(wglGetCurrentDC());
}

void InitOpenGL(HWND hwnd)
{
    int pf;
    PIXELFORMATDESCRIPTOR pfd;

    Hdc = GetDC(hwnd);

    pfd.nSize           = sizeof(PIXELFORMATDESCRIPTOR);
    pfd.nVersion        = 1;
    pfd.dwFlags         = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
    pfd.iPixelType      = PFD_TYPE_RGBA;
    pfd.cColorBits      = 32;
    pfd.cRedBits        = 8;
    pfd.cRedShift       = 16;
    pfd.cGreenBits      = 8;
    pfd.cGreenShift     = 8;
    pfd.cBlueBits       = 8;
    pfd.cBlueShift      = 0;
    pfd.cAlphaBits      = 0;
    pfd.cAlphaShift     = 0;
    pfd.cAccumBits      = 64;    
    pfd.cAccumRedBits   = 16;
    pfd.cAccumGreenBits = 16;
    pfd.cAccumBlueBits  = 16;
    pfd.cAccumAlphaBits = 0;
    pfd.cDepthBits      = 32;
    pfd.cStencilBits    = 8;
    pfd.cAuxBuffers     = 0;
    pfd.iLayerType      = PFD_MAIN_PLANE;
    pfd.bReserved       = 0;
    pfd.dwLayerMask     = 0;
    pfd.dwVisibleMask   = 0;
    pfd.dwDamageMask    = 0;

    pf = ChoosePixelFormat(Hdc, &pfd);
    SetPixelFormat(Hdc, pf, &pfd);
    Hglrc = wglCreateContext(Hdc);
    wglMakeCurrent(Hdc, Hglrc);
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    PAINTSTRUCT ps;

    switch (message)
    {
        case WM_CREATE:
            InitOpenGL(hwnd);
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        case WM_PAINT:
        [COLOR="Red"]
                BeginPaint(Hwnd, &ps);        
        Render();                          
        EndPaint(Hwnd, &ps);
                [/COLOR]  
        break;
        default:
            return DefWindowProc(hwnd, message, wParam, lParam);
            break;
    }
    return 0;
}

INT WINAPI WinMain(HINSTANCE    hInstance,
                   HINSTANCE    hPrevInstance,
                   LPSTR        lpCmdLine,
                   INT          nCmdShow)
{
    WNDCLASSEX wcex;
    MSG msg;
   
    wcex.cbSize         = sizeof(WNDCLASSEX);
    wcex.style          = CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = NULL;
    wcex.hCursor        = NULL;
    wcex.hbrBackground  = NULL;
    wcex.lpszMenuName   = NULL;
    wcex.lpszClassName  = L"ae";
    wcex.hIconSm        = NULL;
   
    RegisterClassEx(&wcex);
   
    Hwnd = CreateWindow(L"ae",
                        L"",
                        WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
                        CW_USEDEFAULT,
                        CW_USEDEFAULT,
                        CW_USEDEFAULT,
                        CW_USEDEFAULT,
                        NULL,
                        NULL,
                        hInstance,
                        NULL);
                         
    ShowWindow(Hwnd, nCmdShow);
    UpdateWindow(Hwnd);

    ZeroMemory(&msg, sizeof(msg));
   
    while(msg.message != WM_QUIT)
    {
        if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);    
        }    
        else
        {
            Render();  
        }
    }
    return (0);  
}


С этими строчками всё работает, без них не работает, в чём проблема?
416
13 августа 2010 года
MaitreDesir
380 / / 02.01.2008
Элементарно, 9l!
Это единственный кусок кода, который делает хоть что-то существенное. Остальное - стандартное создание окошка, оконная функция и т.п. Ну и вызов стандартной процедуры инициализации OpenGL из DelphiWorld'а.
Чтобы понять, что и почему, прежде всего идем сюда - http://msdn.microsoft.com/en-us/library/dd145213(VS.85).aspx и разбираемся с WM_PAINT - сообщением о перерисовке окна.
Собственно у тебя перерисовка окна заключается в инициализации и завершении отрисовки, а - самое главное - в вызове процедуры Render, весь смысл которой в очистке буфера цвета и заполнения его красным. Соответственно, если ты убираешь эти строки - читай: убираешь отрисовку - разумеется у тебя ничего не рисуется.
Зы: прежде чем следующий раз задавать такие вопросы, потрудись немножко почитать все таки литературу и документацию с подмонтированным устройством /dev/head. То, что я сегодня слишком добрый - это случайность. :)
47K
13 августа 2010 года
9l.
33 / / 04.05.2010
Спасибо конечно за доброту, но есть 2 места где вызывается Render(), это в сообщении WM_PAINT и в цикле обработки сообщений, в функции WinMain(), Render() который находиться в WM_PAINT вызывается только один раз(проверено в отладчике), а Render() в цикле обработки сообщений вызывается много раз, но если закомментировать первый Render() то второй не работает, т.е. он вызывается, но почему то не рисует.

Вот собственно код, в котором добавлено постепенное окрашивание в красный цвет.

Код:
#include <windows.h>
#include <gl/gl.h>
#include <gl/glu.h>

HWND    Hwnd;
HGLRC   Hglrc;
HDC     Hdc;

float i = 0.0;

void Render()
{
    i += 0.001;
    glClearColor(i, 0.0, 0.0, 1.0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    SwapBuffers(wglGetCurrentDC());
}

void InitOpenGL(HWND hwnd)
{
    int pf;
    PIXELFORMATDESCRIPTOR pfd;

    Hdc = GetDC(hwnd);

    pfd.nSize           = sizeof(PIXELFORMATDESCRIPTOR);
    pfd.nVersion        = 1;
    pfd.dwFlags         = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
    pfd.iPixelType      = PFD_TYPE_RGBA;
    pfd.cColorBits      = 32;
    pfd.cRedBits        = 8;
    pfd.cRedShift       = 16;
    pfd.cGreenBits      = 8;
    pfd.cGreenShift     = 8;
    pfd.cBlueBits       = 8;
    pfd.cBlueShift      = 0;
    pfd.cAlphaBits      = 0;
    pfd.cAlphaShift     = 0;
    pfd.cAccumBits      = 64;    
    pfd.cAccumRedBits   = 16;
    pfd.cAccumGreenBits = 16;
    pfd.cAccumBlueBits  = 16;
    pfd.cAccumAlphaBits = 0;
    pfd.cDepthBits      = 32;
    pfd.cStencilBits    = 8;
    pfd.cAuxBuffers     = 0;
    pfd.iLayerType      = PFD_MAIN_PLANE;
    pfd.bReserved       = 0;
    pfd.dwLayerMask     = 0;
    pfd.dwVisibleMask   = 0;
    pfd.dwDamageMask    = 0;

    pf = ChoosePixelFormat(Hdc, &pfd);
    SetPixelFormat(Hdc, pf, &pfd);
    Hglrc = wglCreateContext(Hdc);
    wglMakeCurrent(Hdc, Hglrc);
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    PAINTSTRUCT ps;

    switch (message)
    {
        case WM_CREATE:
            InitOpenGL(hwnd);
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        case WM_PAINT:
            i = 0.0;
            BeginPaint(Hwnd, &ps);
            [COLOR="red"]Render();[/COLOR] Первый рендер
            EndPaint(Hwnd, &ps);
            break;
        default:
            return DefWindowProc(hwnd, message, wParam, lParam);
            break;
    }
    return 0;
}

INT WINAPI WinMain(HINSTANCE    hInstance,
                   HINSTANCE    hPrevInstance,
                   LPSTR        lpCmdLine,
                   INT          nCmdShow)
{
    WNDCLASSEX wcex;
    MSG msg;
   
    wcex.cbSize         = sizeof(WNDCLASSEX);
    wcex.style          = CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = NULL;
    wcex.hCursor        = NULL;
    wcex.hbrBackground  = NULL;
    wcex.lpszMenuName   = NULL;
    wcex.lpszClassName  = L"ae";
    wcex.hIconSm        = NULL;
   
    RegisterClassEx(&wcex);
   
    Hwnd = CreateWindow(L"ae",
                        L"",
                        WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
                        CW_USEDEFAULT,
                        CW_USEDEFAULT,
                        CW_USEDEFAULT,
                        CW_USEDEFAULT,
                        NULL,
                        NULL,
                        hInstance,
                        NULL);
                         
    ShowWindow(Hwnd, nCmdShow);
    UpdateWindow(Hwnd);

    ZeroMemory(&msg, sizeof(msg));
   
    while(msg.message != WM_QUIT)
    {
        if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);    
        }    
        else
        {
            [COLOR="Red"]Render();[/COLOR]   //второй рендер
        }
    }
    return (0);  
}
416
13 августа 2010 года
MaitreDesir
380 / / 02.01.2008
Цитата: 9l.
Спасибо конечно за доброту, но есть 2 места где вызывается Render(), это в сообщении WM_PAINT и в цикле обработки сообщений, в функции WinMain(), Render() который находиться в WM_PAINT вызывается только один раз(проверено в отладчике), а Render() в цикле обработки сообщений вызывается много раз, но если закомментировать первый Render() то второй не работает, т.е. он вызывается, но почему то не рисует.



Марш в MSDN. Сказал же - прочитайте хоть немного документации и посмотрите, где и когда можно рисовать

9
13 августа 2010 года
Lerkin
3.0K / / 25.03.2003
9l., братан. При таком отношении, тебя ждет отсроченный, но неизбежный бан. Троллить добрых людей тут никак не разрешается.

Модератор.
47K
13 августа 2010 года
9l.
33 / / 04.05.2010
Мммм, извиняюсь конечно, но я всего лишь уточнил и не задевал/провоцировал на конфликт/грубил т.е. не троллил.
9
13 августа 2010 года
Lerkin
3.0K / / 25.03.2003
Цитата: 9l.
Мммм, извиняюсь конечно, но я всего лишь уточнил и не задевал/провоцировал на конфликт/грубил т.е. не троллил.


Это радует. Так и продолжайте. ;)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог