Конференция "Игры" » Ошибка в GL программе [Delphi, Windows]
 
  • GLProg (06.04.07 21:30) [0]
    Скажите где здесь ошибка.
    При компиляции ничего не появлется только прозрачное окно.  

    program prog;

    uses
     Windows,
     Messages,
     OpenGL;

    var
     h_wnd: HWND;
     h_wc:  TWndClassEx;
     h_dc:  HDC;
     h_rc:  HGLRC;
     msg :  TMsg;

    procedure Draw();
    begin
     glClearColor(1.0, 0.0, 0.0, 0.0); // Set the Background colour of or scene
     glLoadIdentity();                 // Load a "clean" model matrix on the stack
     glClear(GL_COLOR_BUFFER_BIT);     // Clear the colour buffer

     glTranslatef(0.0,0.0,-3.0);       // Move the scene back by 3 units (Will be explained in a later Chapter)

     glColor3f(1.0, 1.0, 1.0);         // Set the colour of the objects that will be dawn later
     glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
     glBegin(GL_POLYGON);              // begin drawing a polygon (Many pointed/ sided shape)
       glVertex2f(-0.5, -0.5);         // Draw a point (Two Dimentional Vertex)
       glVertex2f(-0.5, 0.5);
       glVertex2f(0.5, 0.5);
       glVertex2f(0.5, -0.5);
     glEnd();                          // End the shape

    end;

    procedure Init;
    begin
    //  glClear(GL_COLOR_BUFFER_BIT);
     glClearColor(1.0,1.0,1.0,1.0);
    end;

    procedure Resize(Width, Height : Integer);
    begin
     glViewport(0, 0, Width, Height);    // Set the viewport for the OpenGL window
     glMatrixMode(GL_PROJECTION);        // Change Matrix Mode to Projection
     glLoadIdentity();                   // Reset View
     gluPerspective(45.0, Width/Height, 1.0, 100.0);  // Do the perspective calculations. Last value = max clipping depth

     glMatrixMode(GL_MODELVIEW);         // Return to the modelview matrix
     glLoadIdentity();                   // Reset View
    end;

    {~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
    { Главная процедура обработки сообщений                                        }
    {~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
    function WndProc(hwnd: HWND; msg: integer; wparam: WPARAM; lparam: LPARAM):LResult; stdcall;
    begin
     case msg of
       WM_CREATE:  begin end;
       WM_DESTROY: begin PostQuitMessage(0); Result := 0; end;
       WM_SIZE:    begin Resize(LOWORD(wparam), HIWORD(lparam)) end;
     else
       Result := DefWindowProc(hwnd, msg, wparam, lparam);
     end;
    end;

    {~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
    { Процедура создаёт окно и инициализирует OpenGL                               }
    {~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
    procedure CreateAPP(name: PChar; width, height: integer);
    var
     pfd: TPixelFormatDescriptor;
     nPixelFormat: Integer;
    begin
     // Заполнить структуру h_wc нулями
     FillChar(h_wc, SizeOf(h_wc), 0);
     // Установка основных параметров класса
     h_wc.cbSize := SizeOf(h_wc);
     h_wc.style  := CS_OWNDC or CS_VREDRAW or CS_HREDRAW;  // позволяет перерисовывывать окно
     h_wc.lpfnWndProc := @WndProc;                         // указатель на процедуру обработки сообщений
     h_wc.hInstance    := HInstance;                       // экземпляр приложения
     h_wc.lpszMenuName := nil;                             // отсутствие меню (nil)
     h_wc.hCursor      := LoadCursor(0, IDC_ARROW);        // устанавливаем стандартный курсор
    //  h_wc.hbrBackground := COLOR_BTNFACE+1;                // цвет окна
     h_wc.lpszClassName := 'OpenGL';                       // имя класса
     // Регистрация класса окна в системе
     WINDOWS.RegisterClassEx(h_wc);
     // Создаётся окно
     h_wnd :=  CreateWindowEx(WS_EX_APPWINDOW or       // Top level window
                    WS_EX_WINDOWEDGE, 'OpenGL', name,
       WS_OVERLAPPEDWINDOW or     // Creates an overlapping window
                  WS_CLIPCHILDREN or         // Doesn't draw within child windows
                  WS_CLIPSIBLINGS, 0, 0, width, height, 0, 0,
       Hinstance, nil);

     h_dc := GetDC(h_wnd);

     with pfd do
     begin
       nSize := SizeOf(TPixelFormatDescriptor); // размер структуры
       nVersion := 1;                            // номер версии
       dwFlags := PFD_DOUBLEBUFFER or PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL; // множество битовых флагов, определяющих устройство и интерфейс
       iPixelType := PFD_TYPE_RGBA; // режим для изображения цветов
       cColorBits := 32;            // число битовых плоскостей в каждом буфере цвета
       cRedBits := 0;               // число битовых плоскостей красного в каждом буфере RGBA
       cRedShift := 0;              // смещение от начала числа битовых плоскостей красного в каждом буфере RGBA
       cGreenBits := 0;             // число битовых плоскостей зелёного в каждом буфере RGBA
       cGreenShift := 0;            // смещение от начала числа битовых плоскостей зелёного в каждом буфере RGBA
       cBlueBits := 0;              // число битовых плоскостей синего в каждом буфере RGBA
       cBlueShift := 0;             // смещение от начала числа битовых плоскостей синего в каждом буфере RGBA
       cAlphaBits := 0;             // число битовых плоскостей альфа в каждом буфере RGBA
       cAlphaShift := 0;            // смещение от начала числа битовых плоскостей альфа в каждом буфере RGBA
       cAccumBits := 0;             // общее число битовых плоскостей в буфере аккумулятора
       cAccumRedBits := 0;          // число битовых плоскостей красного в буфере аккумулятора
       cAccumGreenBits := 0;        // число битовых плоскостей зелёного в буфере аккумулятора
       cAccumBlueBits := 0;         // число битовых плоскостей синего в буфере аккумулятора
       cAccumAlphaBits := 0;        // число битовых плоскостей альфа в буфере аккумулятора
       cDepthBits := 32;            // размер буфера глубины (ось z)
       cStencilBits := 0;           // размер буфера трафарета
       cAuxBuffers := 0;            // число вспомогательных буферов
       iLayerType := PFD_MAIN_PLANE;// тип плоскости
       bReserved := 0;              // число плоскостей переднего и заднего плана
       dwLayerMask := 0;            // игнорируется
       dwVisibleMask := 0;          // индекс или цвет прозрачности нижней плоскости
       dwDamageMask := 0;           // игнорируется
     end;

     nPixelFormat := ChoosePixelFormat( H_DC, @pfd ); // запрос системе - поддерживается ли выбранный формат пикселей
     SetPixelFormat( H_DC, nPixelFormat, @pfd );      // устанавливаем формат пикселей в контексте устройства

     h_rc := wglCreateContext(h_dc);
     wglMakeCurrent(h_dc, h_rc);

     // Отображается окно
     ShowWindow(h_wnd, SW_SHOW);
     SetForegroundWindow(h_Wnd);
     SetFocus(h_Wnd);
     Resize(width,height);
     Init;

    end;

    {~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
    { Главный цикл сообщений                                                       }
    {~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
    procedure Loop;
    begin
     while GetMessage(msg, 0, 0, 0) do
     begin
       TranslateMessage(msg);   // переводит сообщения клавиатуры в символьный тип
       DispatchMessage(msg);    // посылает сообщения процедуре обработки сообщений
     end;
     Draw();
     SwapBuffers(h_dc);
    end;

    begin
     CreateAPP('Semple1',800,600);
     Loop;
    end.
  • XProger © (07.04.07 02:28) [1]
    В логике...
    procedure Loop;
    begin
    while GetMessage(msg, 0, 0, 0) do // цикл до прихода WM_QUIT
    begin
      TranslateMessage(msg);   // переводит сообщения клавиатуры в символьный тип
      DispatchMessage(msg);    // посылает сообщения процедуре обработки сообщений
    end;
    Draw();
    SwapBuffers(h_dc);
    end;

 
Конференция "Игры" » Ошибка в GL программе [Delphi, Windows]
Есть новые Нет новых   [134428   +41][b:0][p:0.001]