![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
wglCreateContext возвращает ошибку
_fox © (2006-05-20 12:53:00)В программе есть следующий код
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, не помогает.
_fox (2006-05-30 19:03:00) [1]Rial
1.
> А зачем без толку забивать все поля нулями по два раза ?
Это у меня просто в процессе отлова глюков так получилось:)
2.
> После
> SetDCPixelFormat(dc);
> проверь
> If (GetPixelFormat(Canvas)<0)then begin
> //Ошибка !
> Exit;
> end;
Проверил GetPixelFormat(dc). Оказалось равным 3.
3.
> Проверь (HRC=0) просто
HRC = 65536.
В общем, так вроде все нормально, но только GetLastError возвращает ошибку и частота кадров низкая. В ближайшее время постараюсь проверить на других Радеонах.
Rial (2006-05-21 19:23:00) [2]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-21 17:47:00) [3]Это у меня есть:)
Rial (2006-05-21 17:11:00) [4]hrc:=wglCreateContext(dc);
wglMakeCurrent(DC,HRC);
...
_fox (2006-05-21 14:56:00) [5]Я ставил код проверки перед 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 02:08:00) [6]1. GetLastError возвращает посленююошибку.
Так если ее не было, то ?..
Ты хотябы проверяй, была ли эта ошибка вообще, потому что
ошибка эта может быть вовсе и не здесь, и даже очень не близко случилась.
Или, возможно, ее вообще не было в твоей программе.
2. С трудом телепатируя могу предположить,
что что инициализация OpenGL (или зачем функция wglCreateContext).
Тодга ты забыл слишком многое, чтобы мне хотелось писать тут об этом. Посмотри книгу Краснова для начала. Есть и других куча справочников в инете.
3. Кстати, ошибка может возникнуть и в этой строчке:
SetDCPixelFormat(dc);
Почему ты там ее не проверяешь ? :))