Текущий архив: 2008.11.30;
Скачать: CL | DM;
Вниз
Ошибка в GL программе Найти похожие ветки
← →
GLProg (2007-04-06 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 © (2007-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;
Страницы: 1 вся ветка
Текущий архив: 2008.11.30;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.005 c