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

Вниз

wglCreateContext возвращает ошибку   Найти похожие ветки 

 
_fox ©   (2006-05-20 12:53) [0]

В программе есть следующий код

dc:=GetDC(Win);
SetDCPixelFormat(dc);
hrc:=wglCreateContext(dc);

// сообщение об ошибке
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER or FORMAT_MESSAGE_FROM_SYSTEM,
                         nil, GetLastError(), LANG_NEUTRAL, @lpMsgBuf, 0, nil);
MessageBox(Win, lpMsgBuf, "GetLastError", MB_OK);


У меня на компьютере (GeForce FX6200) выскакивает сообщение
Операция успешно завершена. Такое сообщение появляется на всех компьютерах, где программа работает нормально.
На другом компьютере с Radeon 9250 - сообщение
Параметр задан неверно.
Что это значит?
Программа работает, но частота кадров очень низкая.

И вообще, если после wglCreateContext возникает ошибка, как это понимать?
Ставил Catalyst"ы 5 и 6, не помогает.


 
Rial ©   (2006-05-21 02:08) [1]

1. GetLastError возвращает посленюю ошибку.
Так если ее не было, то ?..
Ты хотябы проверяй, была ли эта ошибка вообще, потому что
ошибка эта может быть вовсе и не здесь, и даже очень не близко случилась.
Или, возможно, ее вообще не было в твоей программе.

2. С трудом телепатируя могу предположить,
что что инициализация OpenGL (или зачем функция wglCreateContext).

Тодга ты забыл слишком многое, чтобы мне хотелось писать тут об этом. Посмотри книгу Краснова для начала. Есть и других куча справочников в инете.

3. Кстати, ошибка может возникнуть и в этой строчке:
SetDCPixelFormat(dc);
Почему ты там ее не проверяешь ? :))


 
_fox ©   (2006-05-21 14:56) [2]

Я ставил код проверки перед wglCreateContext. Ошибка возникает именно после wglCreateContext.

А вот процедура SetDCPixelFormat:

Procedure SetDCPixelFormat(hdc: HDC);
var pfd: PIXELFORMATDESCRIPTOR;
     pf: integer;
begin
FillChar(pfd, sizeOf(PIXELFORMATDESCRIPTOR), 0);
with pfd do begin
   nSize           := SizeOf(TPIXELFORMATDESCRIPTOR); // Size Of This Pixel Format Descriptor
   nVersion        := 1;                    // The version of this data structure
   dwFlags         := PFD_DRAW_TO_WINDOW    // Buffer supports drawing to window
                      or PFD_SUPPORT_OPENGL // Buffer supports OpenGL drawing
                      or PFD_DOUBLEBUFFER;  // Supports double buffering
   iPixelType      := PFD_TYPE_RGBA;        // RGBA color format
   cColorBits      := col_Depth;           // OpenGL color depth
   cRedBits        := 0;                    // Number of red bitplanes
   cRedShift       := 0;                    // Shift count for red bitplanes
   cGreenBits      := 0;                    // Number of green bitplanes
   cGreenShift     := 0;                    // Shift count for green bitplanes
   cBlueBits       := 0;                    // Number of blue bitplanes
   cBlueShift      := 0;                    // Shift count for blue bitplanes
   cAlphaBits      := 0;                    // Not supported
   cAlphaShift     := 0;                    // Not supported
   cAccumBits      := 0;                    // No accumulation buffer
   cAccumRedBits   := 0;                    // Number of red bits in a-buffer
   cAccumGreenBits := 0;                    // Number of green bits in a-buffer
   cAccumBlueBits  := 0;                    // Number of blue bits in a-buffer
   cAccumAlphaBits := 0;                    // Number of alpha bits in a-buffer
   cDepthBits      := 16;                   // Specifies the depth of the depth buffer
   cStencilBits    := 0;                    // Turn off stencil buffer
   cAuxBuffers     := 0;                    // Not supported
   iLayerType      := PFD_MAIN_PLANE;       // Ignored
   bReserved       := 0;                    // Number of overlay and underlay planes
   dwLayerMask     := 0;                    // Ignored
   dwVisibleMask   := 0;                    // Transparent color of underlay plane
   dwDamageMask    := 0;                     // Ignored
end;{}
pf:=ChoosePixelFormat(hdc, @pfd);
SetPixelFormat(hdc, pf, @pfd);
end;

Или я что-то не так делаю?


 
Rial ©   (2006-05-21 17:11) [3]

hrc:=wglCreateContext(dc);
 wglMakeCurrent(DC,HRC);
...


 
_fox ©   (2006-05-21 17:47) [4]

Это у меня есть:)


 
Rial ©   (2006-05-21 19:23) [5]

1.
dwFlags   :=PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
 cDepthBits:=32; //Необходимо для корректной работы объёмного текста
 cColorBits:=32;
 nVersion  :=1;
 iLayerType:=PFD_MAIN_PLANE;

А зачем без толку забивать все поля нулями по два раза ?

Вполне достаточно только это :

dwFlags   :=PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
 cColorBits:=32;

2.
После  
SetDCPixelFormat(dc);
проверь
If (GetPixelFormat(Canvas)<0)then begin
//Ошибка !
  Exit;
 end;

3.
Не трогай ты эту
GetLastError().
Или уж тогда проверяй наличие самой ошибки как таковой.

Проверь (HRC=0) просто.


 
_fox ©   (2006-05-30 19:03) [6]

Rial
1.

> А зачем без толку забивать все поля нулями по два раза ?

Это у меня просто в процессе отлова глюков так получилось:)

2.

> После  
> SetDCPixelFormat(dc);
> проверь
> If (GetPixelFormat(Canvas)<0)then begin
> //Ошибка !
>   Exit;
>  end;

Проверил GetPixelFormat(dc). Оказалось равным 3.

3.

> Проверь (HRC=0) просто

HRC = 65536.

В общем, так вроде все нормально, но только GetLastError возвращает ошибку и частота кадров низкая. В ближайшее время постараюсь проверить на других Радеонах.



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

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

Наверх




Память: 0.49 MB
Время: 0.031 c
2-1167461613
AlexeyT
2006-12-30 09:53
2007.01.21
Создать пункт меню в правой части MainMenu


15-1166785722
MBo
2006-12-22 14:08
2007.01.21
Пятничные задачки ;)


2-1168004094
Тиммммм
2007-01-05 16:34
2007.01.21
монохром


2-1166950681
allrussia
2006-12-24 11:58
2007.01.21
Куда пропадает значение счетчика?


2-1166697532
nickhilo
2006-12-21 13:38
2007.01.21
Линейка как в Word е.