-
Скажите где здесь ошибка. При компиляции ничего не появлется только прозрачное окно.
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.
-
В логике... procedure Loop;
begin
while GetMessage(msg, 0, 0, 0) do begin
TranslateMessage(msg); DispatchMessage(msg); end;
Draw();
SwapBuffers(h_dc);
end;
|