Форум: "Media";
Текущий архив: 2007.01.21;
Скачать: [xml.tar.bz2];
Вниз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 вся ветка
Форум: "Media";
Текущий архив: 2007.01.21;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.07 c