Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.31;
Скачать: CL | DM;

Вниз

Работа OGL под ХР   Найти похожие ветки 

 
ПЛОВ   (2004-06-29 11:09) [0]

Доброе время суток! Пижу программу на OGL. Под 98 все работает как надо, но вот под ХР возникают проблеммы - код не работает:

var
 HRC: windows.HGLRC;

//FormCreate
HRC:=windows.wglCreateContext(Form1.Canvas.Handle);

//рисование на wm_paint
windows.wglMakeCurrent(Form1.Canvas.Handle, HRC);
glClearColor(0.5, 0.8, 0, 1);
glViewPort(0, 0, 400, 300);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glClear(GL_COLOR_BUFFER_BIT);
... // тут есть другие действия, но даже если их исключить - тот же еффект
windows.wglMakeCurrent(0, 0);

// дэстрой
windows.wglDeleteContext(HRC);


 
ПЛОВ   (2004-06-29 11:12) [1]

Собственно, вопрос - что может быть неправильно и какие особенности работы с OGL в NT системмах?


 
ПсихЪ_клон   (2004-06-29 11:13) [2]

1. Забей на канву
2. Забей на TForm
3. Пиши на голом АПИ (форму создавай)
4. Примеров ОЧЕНЬ много
5. Всё очень просто, если немножко с начала разобраться...


 
ПЛОВ   (2004-06-29 11:46) [3]


> ПсихЪ_клон

Забил и писал на апи - то же самое.

> Всё очень просто, если немножко с начала разобраться

у меня были хорошие примеры, но не помогли((((( могу привести код и апи-программы если надо... она в 98 тоже кстати работала на ура


 
Darthman ©   (2004-06-29 11:56) [4]

рисуй не в wmpaint, а в обработчике сообщений.


 
ПсихЪ_клон   (2004-06-29 11:59) [5]

"Проблемы", "код не работает" - это как-то туманно и расплывчато...

И нафиг тебе нужен HGLRC? Я юзаю обычный HDC (DC : HDC).

И вообще, давай-ка лучше код, посмотрим, чё-нить исправим...


 
ПЛОВ   (2004-06-29 12:36) [6]


> рисуй не в wmpaint, а в обработчике сообщений

Это не принципиально... Факт в том что нужно нарисовать картинку по какому-то сообщению (wm_paint OR wm_keydown OR ..что нить другое)


 
ПЛОВ   (2004-06-29 12:39) [7]


> И вообще, давай-ка лучше код, посмотрим, чё-нить исправим

Код:



{$APPTYPE GUI}
{$N+,S-}
{$Q-,R-,T-,I-,X+}

program ogle;

uses Windows, Messages, Gl, Glsed;

const
 WCLASSNAME    = "OGLE1";
 WNAME         = "Demo";

var
 // main window
 Window: HWnd;
 WClass: TWndClassEx;
 Msg: TMsg;
 XWINPOS, YWINPOS: DWORD;

 // main timer
 PTIMER: Cardinal;

 // gl & graphic
 DC: HDC;
 HRC: windows.HGLRC;

 Img: array[0..31, 0..31, 0..2] of GLUbyte;
 x, y: DWORD;

function WindowProc(Wnd: HWnd; Msg, WParam: Word; LParam: LongInt): LongInt; stdcall;
var
 GLERROR: Cardinal;

 I: WORD;

begin
case Msg of
 WM_CREATE:
 begin
 PTIMER:=SetTimer(Wnd, 0, 100, nil);

 DC:=GetDC(Wnd);
 SetDCPixelFormat(DC);
 HRC:=windows.wglCreateContext(DC);

 windows.wglMakeCurrent(DC, HRC);
 glClearColor(0, 0, 0, 1);
 glViewPort(0, 0, 400, 300);
 glEnable(GL_BLEND);
 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

 glClear(GL_COLOR_BUFFER_BIT);
 
 end;

 WM_TIMER:
 begin

 .....................................

 // errors
 GLERROR:=glGetError;
 if GLERROR>0 then
   begin
   KillTimer(Wnd, PTIMER);
   GetGLSEDMessage(GetDesktopWindow, GLERROR, 0);
   PostQuitMessage(0);
   Exit;
   end;

 end;

 WM_LBUTTONDOWN:
 begin
 ReleaseCapture;
 WindowProc(Wnd, WM_SYSCOMMAND, $F012, 0);
 end;

 WM_RBUTTONDOWN:
 begin

 end;

 WM_DESTROY:
 begin
 windows.wglMakeCurrent(0, 0);

 ReleaseDC(Wnd, DC);
 DeleteDC(DC);
 KillTimer(Wnd, PTIMER);
 windows.wglDeleteContext(HRC);
 PostQuitMessage(0);
 Exit;
 end;
end;
WindowProc:=DefWindowProc(Wnd, Msg, WParam, LParam);
end;

begin
Window:=FindWindow(WCLASSNAME, WNAME);
if Window<>0 then
 begin
 GetGLSEDMessage(GetDesktopWindow, GL_NO_ERROR, 1);
 Exit;
 end;

WClass.cbSize:=SizeOf(WClass);
WClass.Style:=CS_HREDRAW or CS_VREDRAW;
WClass.lpfnWndProc:=@WindowProc;
WClass.cbClsExtra:=0;
WClass.cbWndExtra:=0;
WClass.hInstance:=hInstance;
WClass.hCursor:=LoadCursor(0, IDC_ARROW);
WClass.lpszClassName:=WCLASSNAME;

if RegisterClassEx(WClass)=0 then Halt(255);

XWINPOS:=GetSystemMetrics(SM_CXFULLSCREEN) div 2 - 200;
YWINPOS:=GetSystemMetrics(SM_CYFULLSCREEN) div 2 - 150;

Window:=CreateWindowEx(0, WCLASSNAME, WNAME, WS_POPUP and (not WS_DLGFRAME), XWINPOS, YWINPOS, 400, 300, 0, 0, hInstance, nil);
ShowWindow(Window, SW_SHOWNORMAL);

while GetMessage(Msg, 0, 0, 0) do
begin
 TranslateMessage(Msg);
 DispatchMessage(Msg);
end;
Halt(Msg.wParam);
end.

Кое-чего нет но это не важно...


 
ПсихЪ_клон   (2004-06-29 13:11) [8]

Чё такое GLsed? Где его брать?

В общем вот тебе исходник моего класса для работы с OpenGL, можешь его использовать или выдрать интересующие тебя функции. Всё работет под Win2k, WinXP. Под остальным не тестил, но наверняка работает тоже...


 
ПсихЪ_клон   (2004-06-29 13:12) [9]


unit p7_gfx;

interface
uses
 Messages, Windows, Classes, Types,
 OpenGL,
 p7_types;

type
 PTFNWndProc = ^TFNWndProc;
 
 P7Input = record
   X, Y : int;
   dwX, dwY : DWORD;
   sX, sY, sZ : GLInt;
   But : array[0..2] of bool;
   Keys : array[0..255] of bool;
 end;

 P7PGfx = ^P7Gfx;
 PP7Gfx = ^P7Gfx;
 P7Gfx = class
   Msg : TMSG;
   Wnd : hWnd;
   DC : HDC;
   HRC: HGLRC;
   bActive : bool;
   bFinished : bool;
   ScreenWidth,
   ScreenHeight,
   CaptionBarHeight,
   ScreenBPP : int;
   CoordNow : byte;
   CoordLast : byte;
 private
   szWinName : PChar;
   bFullScreen : bool;
   baseFont : GLuint;
   FPSTickCount : GLFloat;
   FPSCount : GLFloat;
 public
   Input : P7Input;
   WinProc : function(Window: hWnd; Message, wParam: Word; lParam: LongInt): LongInt; stdcall;

 // functions
 private
   // Window
   procedure SetFullscreen( Width, Height, BPP : integer );
   function CreateWin( Width, Height, BPP : int; bFullScreen : bool ) : hWnd;
   procedure DestroyWin( Wnd : hWnd; bFullScreen : bool );
   // OpenGL
   procedure SetPixFormat( HDC: HDC );
   procedure InitGL();
   function Messages() : bool;
 public
   constructor Create();
   procedure Init( WinName : string; Width, Height, BPP : int; FullScreen : bool = false );
   procedure SetPerspective( Width, Height : int );
   procedure ResizeWin( Width, Height : int );
   procedure SetCoord( Flag : byte );
   procedure BuildFont();
   procedure glWrite( X, Y : uint; text : PChar );
   procedure KillFont();
   function gfxBegin() : bool;
   procedure gfxEnd();
   procedure gfxBegin2D();
   procedure gfxEnd2D();
   procedure DrawCoordLine();
   procedure DrawCoordBox();
   destructor Destroy(); virtual;
 end;

implementation

{   PRIVATE FUNCTIONS   }

// Включение полноэкранного режима
procedure P7Gfx.SetFullscreen( Width, Height, BPP : integer );
var DeviceMode: TDevMode;
begin
 with DeviceMode do
 begin
   dmSize := SizeOf(DeviceMode);
   dmPelsWidth := Width;
   dmPelsHeight := Height;
   dmBitsPerPel := BPP;
   dmFields := DM_PELSWIDTH or DM_PELSHEIGHT or DM_BITSPERPEL;
 end;
 ChangeDisplaySettings(DeviceMode, CDS_FULLSCREEN);
end;

// Создание окна
function P7Gfx.CreateWin( Width, Height, BPP : int; bFullScreen : bool ) : hWnd;
var
 WindowClass: TWndClass;
 hInstance: HINST;
 Style: Cardinal;
begin
 hInstance := GetModuleHandle(nil);

 ZeroMemory(@WindowClass, SizeOf(WindowClass));
 with WindowClass do
 begin
   Style := CS_HREDRAW or CS_VREDRAW or CS_OWNDC;
   lpfnWndProc := @WinProc; //@DefWindowProc;
   cbClsExtra := 0;
   cbWndExtra := 0;
   hInstance := hInstance;
   hIcon := LoadIcon(0, IDI_APPLICATION);
   hCursor := LoadCursor(0, IDC_ARROW);
   hbrBackground := HBRUSH( GetStockObject( WHITE_BRUSH ) );
   lpszMenuName := "";
   lpszClassName := "P7GfxWinClass";
 end;
 Windows.RegisterClass(WindowClass);

 if bFullScreen then
 begin
   Style := WS_POPUP or WS_CLIPSIBLINGS or WS_CLIPCHILDREN;
   SetFullscreen( Width, Height, BPP );
   CaptionBarHeight := 0;
   // ShowCursor( false );
 end
 else
 begin
   Style := WS_OVERLAPPEDWINDOW or WS_CLIPSIBLINGS or WS_CLIPCHILDREN;
   CaptionBarHeight := 26;
 end;

 Result := CreateWindowEx(WS_EX_APPWINDOW or WS_EX_WINDOWEDGE, "P7GfxWinClass", szWinName, Style, 0, 0, Width, Height + CaptionBarHeight, 0, 0, hInstance, nil);
 ShowWindow( Result, SW_SHOW );
 UpdateWindow( Result );
end;

// Удаление окна
procedure P7Gfx.DestroyWin( Wnd : hWnd; bFullScreen : bool );
begin
if bFullscreen then
 begin
  ChangeDisplaySettings(TDevMode(nil^), CDS_FULLSCREEN);
  // ShowCursor( true );
 end;
DestroyWindow( Wnd );
Windows.UnregisterClass( "P7GfxWinClass", hInstance );
end;

// Установка формата пикселя
procedure P7Gfx.SetPixFormat( HDC: HDC );
var
 pfd: TPixelFormatDescriptor;
 nPixelFormat: Integer;
begin
 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( HDC, @pfd ); // запрос системе - поддерживается ли выбранный формат пикселей
 SetPixelFormat( HDC, nPixelFormat, @pfd );      // устанавливаем формат пикселей в контексте устройства
end;


 
ПсихЪ_клон   (2004-06-29 13:12) [10]



// Инициализации OpenGL
procedure P7Gfx.InitGL();
begin
 // GL
 DC := GetDC( Wnd );
 SetPixFormat( DC );
 HRC := wglCreateContext( DC );
 ReleaseDC( Wnd, DC );
 wglMakeCurrent( DC, HRC );

 // Z Buffer
 glClearDepth( 1.0 );
 glEnable( GL_DEPTH_TEST );
 glDepthFunc( GL_LESS );

 glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);   //Realy Nice perspective calculations

 // Back color
 glClearColor( 0.0, 0.0, 0.0, 0.0 );
end;

function P7Gfx.Messages() : bool;
begin
 Result := false;
 // Подготовка Окна
 if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
 begin
   if Msg.Message = WM_QUIT then bFinished := True
   else
   begin
     TranslateMessage( Msg );
     DispatchMessage( Msg );
   end;
   exit;
 end
 else if not bActive then exit;

 Result := true;
end;

{   PUBLIC FUNCTIONS   }

// Инициализация класса
constructor P7Gfx.Create();
begin
 bFinished := false;
end;

procedure P7Gfx.Init( WinName : string; Width, Height, BPP : int; FullScreen : bool = false );
begin
 szWinName := PChar( WinName );
 ScreenWidth := Width;
 ScreenHeight := Height;
 ScreenBPP := BPP;
 bFullScreen := FullScreen;
 Wnd := CreateWin( Width, Height, BPP, FullScreen );
 InitGL();
 ResizeWin( Width, Height );
end;

// Задаём перспективу
procedure P7Gfx.SetPerspective( Width, Height : int );
begin
 glViewport( 0, 0, Width, Height );
 glMatrixMode( GL_PROJECTION );
 glLoadIdentity();
 gluPerspective( 90.0, Width / Height, 1.0, 1.0 );
 glMatrixMode( GL_MODELVIEW );
 glLoadIdentity();
end;

// Изменение размеров окна
procedure P7Gfx.ResizeWin( Width, Height : int );
begin
 ScreenWidth := Width;
 ScreenHeight := Height;

 glViewport(0, 0, ScreenWidth, ScreenHeight);    // Set the viewport for the OpenGL window
 glMatrixMode(GL_PROJECTION);        // Change Matrix Mode to Projection
 glLoadIdentity();                   // Reset View
 //gluPerspective(45.0, ScreenWidth/ScreenHeight, 0.1, 100.0);  // Do the perspective calculations. Last value = max clipping depth
 glFrustum( -( Width/Height ), ( Width/Height ), -1, 1, 1.0, 100.0 );
 glTranslatef( 0.0, 0.0, -2.0 );
 glMatrixMode(GL_MODELVIEW);         // Return to the modelview matrix
 glLoadIdentity();
 CoordNow := P7_COORD3D;
end;

// Задание кординатной системы
procedure P7Gfx.SetCoord( Flag : byte );
begin
 if CoordNow = Flag then exit;

 Case Flag of
   P7_COORD2D : begin
     glPushMatrix();
     glMatrixMode(GL_PROJECTION);  // Change Matrix Mode to Projection
     glLoadIdentity();             // Reset View
     glOrtho(0, ScreenWidth, 0, ScreenHeight, 0, 100);
     glMatrixMode(GL_MODELVIEW);   // Change Projection to Matrix Mode
     glLoadIdentity;
     glTranslatef(0, 0, -1);
   end;
   P7_COORD3D : begin
     ResizeWin( ScreenWidth, ScreenHeight );
   end;
   P7_COORD_RESTORE : begin
     SetCoord( CoordLast );
   end;
 end;
 if Flag <> P7_COORD_RESTORE then
 begin
   CoordLast := CoordNow;
   CoordNow := Flag;
 end;
end;

// Создаём базовый текст
procedure P7Gfx.BuildFont();
var font : HFONT;
begin
 baseFont := glGenLists( 255 );
 font := CreateFont( -18, 0, 0, 0, FW_BOLD, 0, 0, 0, ANSI_CHARSET, OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS, ANTIALIASED_QUALITY, FF_DONTCARE or DEFAULT_PITCH, "Arial" );
 SelectObject( DC, font );
 wglUseFontBitmaps( DC, 0, 255, baseFont );
end;

// Рисуем текст
procedure P7Gfx.glWrite( X, Y : GLUint; text : PChar );
begin
 glColor3f(1.0, 1.0, 1.0);
 glRasterPos2i(X, Y);
 glPushAttrib(GL_LIST_BIT);
 glListBase( baseFont );
 glCallLists(length(text), GL_UNSIGNED_BYTE, PChar(text));
 glPopAttrib();
end;

// Удаляем базовый текст
procedure P7Gfx.KillFont();
begin
 glDeleteLists( baseFont, 255 );
end;

// Начало рендеринга
function P7Gfx.gfxBegin() : bool;
begin
 Result := false;
 if not Messages() then exit;

 // Подготовка OpenGL
 glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
 glLoadIdentity();                                       // Reset The View

 Result := true;
end;

// Завершение рендеринга
procedure P7Gfx.gfxEnd();
begin
 //glPopMatrix();
 SwapBuffers(DC);
end;

// Начало двумерного рендеринга
procedure P7Gfx.gfxBegin2D();
begin
 SetCoord( P7_COORD2D );
 glDisable( GL_DEPTH_TEST );
 glTranslatef( 0, 0, -1.0 );
end;

// Конец двумерного рендеринга
procedure P7Gfx.gfxEnd2D();
begin
 glEnable( GL_DEPTH_TEST );
 SetCoord( P7_COORD_RESTORE );
end;

//
procedure P7Gfx.DrawCoordLine();
begin
 glBegin( GL_LINES );
   // Ось X
   glColor3d( 1.0, 0.0, 0.0 );
   glVertex3d( 0.0, 0.0, 0.0 );
   glVertex3d( 1.0, 0.0, 0.0 );
   // Ось Y
   glColor3d( 0.0, 1.0, 0.0 );
   glVertex3d( 0.0, 0.0, 0.0 );
   glVertex3d( 0.0, 1.0, 0.0 );
   // Ось Z
   glColor3d( 0.0, 0.0, 1.0 );
   glVertex3d( 0.0, 0.0, 0.0 );
   glVertex3d( 0.0, 0.0, 1.0 );

   glColor3d( 1.0, 1.0, 1.0 );
 glEnd();
end;

procedure P7Gfx.DrawCoordBox();
begin
 glColor3d( 0.0, 1.0, 0.0 );
 glBegin( GL_LINES );
   glVertex3f(-1.0, -1.0,  1.0);
   glVertex3f( 1.0, -1.0,  1.0);

   glVertex3f( 1.0, -1.0,  1.0);
   glVertex3f( 1.0,  1.0,  1.0);

   glVertex3f( 1.0,  1.0,  1.0);
   glVertex3f(-1.0,  1.0,  1.0);

   glVertex3f(-1.0,  1.0,  1.0);
   glVertex3f(-1.0, -1.0,  1.0);

   //
   glVertex3f(-1.0, -1.0, -1.0);
   glVertex3f(-1.0,  1.0, -1.0);

   glVertex3f(-1.0,  1.0, -1.0);
   glVertex3f( 1.0,  1.0, -1.0);

   glVertex3f( 1.0,  1.0, -1.0);
   glVertex3f( 1.0, -1.0, -1.0);

   glVertex3f( 1.0, -1.0, -1.0);
   glVertex3f(-1.0, -1.0, -1.0);
 glEnd();
 glColor3d( 1.0, 1.0, 1.0 );
end;
// Уничтожение класса
destructor P7Gfx.Destroy();
begin
 //DestroyTheWindow;
 DestroyWin( Wnd, bFullScreen );
end;
end.


 
ПЛОВ   (2004-06-29 13:40) [11]

Спасибо, буду разбираться. Glsed к Gl отношения не имеет там только функции "отекстивания" кодов ошибок и все


 
Darthman ©   (2004-06-29 15:58) [12]

ПЛОВ:
Не нашел в твоем коде заполнение дескриптора пиксела.


 
ПЛОВ   (2004-07-01 12:18) [13]


заполнение дескриптора пиксела

Значит его там нет :) можно чуть подробнее...


 
WondeRu ©   (2004-07-02 09:05) [14]

>Не нашел в твоем коде заполнение дескриптора пиксела.
вот он SetDCPixelFormat(DC);


 
Sphinx   (2004-07-02 11:52) [15]

Есть один простой ответ, но может конечно не та ситуация.
В ХР (про SP1 не скажу) изначально нет библиотеки OGL, то есть под свежеустановленной ОС приложения OGL не работают. К примеру nVidia поставляет эту библиотеку вместе с драйверами. Это проверено, то есть нужно сперва установить файлы opengl32.dll и glum.dll и т.д.


 
ПЛОВ   (2004-07-02 17:20) [16]

Проверил - файлы есть...



Страницы: 1 вся ветка

Текущий архив: 2004.10.31;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.031 c
14-1097432161
Abuzer
2004-10-10 22:16
2004.10.31
Какой выбрать хост?


14-1097179489
lak
2004-10-08 00:04
2004.10.31
моей маме жарко :)


14-1097537109
Knight
2004-10-12 03:25
2004.10.31
Кажется, придётся менять ник...


14-1097654598
aleshap
2004-10-13 12:03
2004.10.31
Защита


11-1082007349
nester
2004-04-15 09:35
2004.10.31
Как создать поток без MCK?