Форум: "Игры";
Текущий архив: 2004.10.31;
Скачать: [xml.tar.bz2];
ВнизРабота 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;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.035 c