---- 그래픽 프로그램, 특히 3차원 그래픽 프로그램을 개발할 때 OpenGL이 DirectX만큼 복잡하지 않다고 느꼈기 때문에 DelphiOpenGL을 선택했습니다. 그래서 저는 Delphi+를 선택했습니다. 그 과정에서 (확실히) 몇 가지 문제에 직면하게 되었는데, 친구들과 소통할 수 있기를 바라는 마음을 전하고 싶습니다.
----첫 번째는 초기화입니다. 초기화 중에는 여러 작업을 수행해야 합니다. ① 장치 설명 테이블(Device Context)을 생성합니다. (참고: DC의 경우 장치 환경, 장치 설명 표, 장치 컨텍스트 등 다양한 자료의 번역이 다르지만 그다지 적절하지 않은 것 같습니다. Li Shanlan 같은 번역가가 있으면 좋을 것 같습니다. 아래 RC 상황도 마찬가지입니다. ) ②해당 픽셀 형식(PIXELFORMAT DESCRipTOR)을 설정합니다. ③렌더링 설명 테이블(Rendering Context)을 생성합니다. Delphi에서 장치 컨텍스트 테이블을 얻거나 생성하는 방법에는 여러 가지가 있습니다. 가장 간단한 방법은 다음과 같이 캔버스 객체(TCanvas)의 핸들 속성(Handle)을 직접 얻는 것입니다.
DC: HDC; DC: = Canvas.Handle; API 함수 GetDC를 사용하여 장치 설명 테이블을 얻을 수도 있습니다. 예: DC:=GetDC(Handle, DC);
---- CreateCompatibleDC 또는 BeginPaint..EndPaint(이들 사이의 차이점에 주의해야 함) 기능을 사용하여 장치 설명 테이블을 얻을 수도 있습니다. 그러나 장치 설명 테이블을 모두 사용한 후에는 이를 해제하거나 삭제하여 리소스를 확보해야 합니다. 장치 컨텍스트 테이블에 액세스하면 해당 픽셀 형식을 설정할 수 있습니다. 픽셀 형식은 (적어도 지금은) 거의 사용되지 않는 일부 필드가 포함된 레코드 유형입니다. 픽셀 형식 설명이 완료된 후 ChoosePixelFormat 및 SetPixelFormat 함수를 호출하여 장치 설명 테이블과 일치시키고 설정합니다. 다음 코드와 같습니다.
function SetupPixelFormat(var dc:HDC):Boolean;var ppfd:PPIXELFORMATDESCRIPTOR; npixelformat:Integer;begin New(ppfd); ppfd^.nSize:=sizeof(PIXELFORMATDESCRIPTOR):=1;ppfd^.dwFlags: =PFD_DRAW_TO_WINDOW 또는 PFD_SUPPORT_OPENGL 또는 PFD_DOUBLEBUFFER; ppfd^.iPixelType:=PFD_TYPE_COLORINDEX:=8; ppfd^.cAccumBits:=0; ppfd^.cStencilBits:=0; npixelformat:=ChoosePixelFormat(dc, ppfd); if (nPixelformat=0) messageBox(NULL, 'choosePixelFormat failed', 'Error', MB_OK); ; if (SetPixelFormat(dc, npixelformat, ppfd)= FALSE) start MessageBox(NULL, 'SetPixelFormat failed', 'Error', MB_OK); Result:=False; End:=True; end; pfd: PixelFormatDescriptor; nPixelFormat : 정수; 시작 FillChar(pfd,SizeOf(pfd),0); pfd do start nSize:=sizeof(pfd); nVersion:=1;dwFlags:=PFD_SUPPORT_OPENGL 또는 PFD_DRAW_TO_BITMAP 또는 PFD_DOUBLEBUFFER:=PFD_TYPE_RGBA; cDepthBits:=32; iLayerType:=Byte(PFD_MAIN_PLANE); nPixelFormat:=ChoosePixelFormat(DC,@pfd); SetPixelFormat(DC,nPixelFormat,@pfd); explainPixelFormat을 사용하여 픽셀 형식이 올바르게 설정되었는지 확인하십시오. 사용자 정의 함수 }end;
----위 작업이 완료된 후 다시 실행하여 nPixelFormat 값을 확인하는 것이 가장 좋습니다. 일반적으로 이 값은 0보다 커야 하며, 그렇지 않으면 문제가 발생합니다. 동일한 코드에 대해 NT 시스템에서는 0보다 큰 올바른 값을 얻을 수 있지만 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);
---- 다음 코드는 C++Builder 4의 OpenGL 예제에서 수정되었습니다. 컴파일된 프로그램의 크기는 약 300K인 반면, C++Builder 4에서 컴파일된 프로그램의 크기는 384K입니다.
---- < a href="061403-05.zip ">프로그램 코드 우편번호 3KB
---- 프로그램의 OpenGL 기능과 픽셀 형식은 Delphi의 MSHelp에 자세히 설명되어 있습니다.