---- При разработке графических программ, особенно программ трехмерной графики, я выбрал DelphiOpenGL, поскольку чувствовал, что OpenGL не так сложен, как DirectX. С точки зрения ощущений Delphi не так сложен, как C++, и более удобен для пользователя. поэтому я выбрал Delphi+. В процессе я столкнулся (определенно) с некоторыми проблемами и хотел бы выразить надежду, что смогу общаться со своими друзьями.
----Первое — инициализация. Во время инициализации необходимо выполнить несколько задач: ① Создать таблицу описания устройства (Контекст устройства). (Примечание: Что касается DC, то переводы различных материалов различаются, например, среды устройства, таблицы описания устройства, контекста устройства и т. д., но они кажутся не очень подходящими. Было бы здорово, если бы был такой переводчик, как Ли Шанлань. Ситуация с RC ниже такая же) ② Установите соответствующий формат пикселей (PIXELFORMAT DESCRipTOR). ③Создайте таблицу описания рендеринга (контекст рендеринга). Существует несколько способов получить или создать таблицы контекста устройства в Delphi. Самый простой — напрямую получить атрибут дескриптора (Handle) объекта холста (TCanvas), например:
DC: HDC;DC:= Canvas.Handle; вы также можете использовать API-функцию GetDC для получения таблицы описания устройства. Например: DC:=GetDC(дескриптор, DC);
---- Также можно использовать функцию CreateCompatibleDC или BeginPaint..EndPaint (нужно обратить внимание на разницу между ними) для получения таблицы описания устройства. Однако после того, как таблица описания устройств будет израсходована, необходимо не забыть освободить или удалить ее, чтобы освободить ресурсы. Получив доступ к таблице контекста устройства, вы можете установить соответствующий формат пикселей. Пиксельный формат — это тип записи с некоторыми полями или полями, от которых мало пользы (по крайней мере, на данный момент). После завершения описания формата пикселя вызовите функции ChoosePixelFormat и SetPixelFormat для сопоставления и установки его с таблицей описания устройства. Например, следующий код:
функция SetupPixelFormat(var dc:HDC):Boolean;var ppfd:PPIXELFORMATDESCRIPTOR; npixelformat:Integer;begin New(ppfd^.nSize:=sizeof(PIXELFORMATDESCRIPTOR); =PFD_DRAW_TO_WINDOW или PFD_SUPPORT_OPENGL или PFD_DOUBLEBUFFER; ppfd^.dwLayerMask:=PFD_MAIN_PLANE; ppfd^.iPixelType:=PFD_TYPE_COLORINDEX; ppfd^.cColorBits:=8; ppfd^.cDepthBits:=16; ppfd^.cStencilBits:=0; npixelformat:=ChoosePixelFormat(dc, ppfd); if (nPixelformat=0) then Begin MessageBox(NULL, 'Ошибка выбораPixelFormat', MB_OK); Результат:=False End; ; если (SetPixelFormat(dc, npixelformat, ppfd)= FALSE) then start MessageBox(NULL, 'SetPixelFormat error', MB_OK Result:=False end; Result:=True; Dispose(ppfd);end; pfd: PixelFormatDescriptor nPixelFormat: целое число; начало; FillChar(pfd,SizeOf(pfd),0); с pfd начать nSize:=sizeof(pfd); nVersion:=1;dwFlags:=PFD_SUPPORT_OPENGL или PFD_DRAW_TO_BITMAP или PFD_DOUBLEBUFFER; cDepthBits:=32; iLayerType:=Byte(PFD_MAIN_PLANE); end; nPixelFormat:=ChoosePixelFormat(DC,@pfd); SetPixelFormat(DC,nPixelFormat,@pfd); Используйте DescribePixelFormat, чтобы проверить, правильно ли установлен формат пикселей. DescribePixelFormat(DC,nPixelFormat,SizeOf(pfd),@pfd); if (pfd.dwFlags and PFD_NEED_PALETTE) < > 0 then SetupPalette(DC,pfd);//SetupPalette является пользовательская функция }end;
----После завершения вышеуказанной работы лучше всего запустить ее еще раз и проверить значение nPixelFormat. Обычно это значение должно быть больше 0, иначе возникнут проблемы. Для того же кода я могу получить правильное значение больше 0 на машине NT, но не правильное значение на машине PWIN97 или 98. Однако при компиляции проблем не возникнет, и после компиляции на NT они также могут возникнуть. используется на машине PWIN97. Работайте правильно. Теперь пришло время создать контекст затенения (RC). Вызовите функции wglCreateContext и wglMakeCurrent, как показано в следующем примере:
RC: HGLRC; RC:=wglCreateContext(DC); wglMakeCurrent(DC,RC); Прежде чем программа завершится, не забудьте освободить занятые ресурсы. wglMakeCurrent(0,0); если RC< >null, то wglDeleteContext(RC); если ghDC< >null, то ReleaseDC(Handle,DC);
---- Следующий код адаптирован из примера OpenGL в C++Builder 4. Размер скомпилированной программы составляет около 300 КБ, а размер скомпилированной программы под C++Builder 4 — 384 КБ.
---- <a href="061403-05.zip ">Код программы Zip 3КБ
---- Функции OpenGL и формат пикселей в программе подробно описаны в MSHelp в Delphi. Эта статья не осмеливается объяснять больше.