1. 서문:
Delphi는 기본적으로 OpenGL을 지원합니다. OpenGL 유닛을 사용하여 이를 참조한 다음 OpenGL 기능을 사용할 수 있습니다. OpenGl은 크로스 플랫폼이며 Windows에서는 오랫동안 이를 지원하고 시스템에 통합했습니다. OpenGl32.dll은 system32에 존재하며 추가 설치가 필요하지 않습니다. Windows 자체에는 d3d가 있지만 기능이 제한되어 있고 관련 학습 자료 페이지가 상대적으로 적습니다.
일반적으로 OpenGL은 점, 선 및 다각형과 같은 기본 기하학적 모양만 지원합니다 . 표면이나 더 높은 수준의 그래픽(예: 구)은 기본 그래픽 요소로 그릴 수 없습니다. 하지만 폴리곤을 사용하면 완벽하게 시뮬레이션할 수 있습니다. 현대 3D 게임을 가볍게 살펴보면 게임이 거의 전적으로 삼각형으로 만들어졌다는 것을 알 수 있습니다. 그러므로 우리는 이 제한에 구속되지 않습니다.
2. 초기화
OpenGL을 사용하기 전에 몇 가지 관련 매개변수를 설정해야 합니다. 일반적인 프로세스는 다음과 같습니다.
"일치하는 픽셀 형식 설정"(ChoosePixelFormat, SetPixelFormat)
"새 OpenGL 렌더링 컨텍스트 만들기"(wglCreateContext)
"OpenGL 관련 매개변수 설정", "그리기"(glBegin, glEnd)
"OpenGL 렌더링 컨텍스트 삭제"(wglDeleteContext)
절차 TForm1.FormCreate(Sender: TObject);var pfd:TPIXELFORMATDESCRIPTOR; pixelFormat: Integer;begin With pfd do start nSize := sizeof(TPIXELFORMATDESCRIPTOR); // size nVersion := 1; // 버전 dwFlags := PFD_SUPPORT_OPENGL 또는 PFD_DRAW_TO_WINDOW PFD_DOUBLEBUFFER; // 이중 버퍼링 지원 iPixelType := PFD_TYPE_RGBA; // 색상 유형 cColorBits := 24; // 선호하는 색상 심도 cRedBits := 0; // 색상 비트(무시됨) cGreenShift := 0; cBlueBits := 0; cBlueShift := 0; cAlphaBits := 0; cAlphaShift := 0; // 축적 버퍼 없음, cAccumGreenBits := 0; = 0; cDepthBits := 16; // 깊이 버퍼 cStencilBits := 0; // 스텐실 버퍼 없음 cAuxBuffers := PFD_MAIN_PLANE; // 메인 레이어 bReserved := 0; dwVisibleMask := 0; = GetDC(핸들):= ChoosePixelFormat(FDC, @pfd); pixelFormat = 0이면 종료하고, 그렇지 않으면 SetPixelFormat(FDC, pixelFormat, @pfd) FHRC := wglMakeCurrent(FDC, FHRC); 검정색 매개변수는 RGBA입니다. glClearColor(0, 0, 0, 0); //뷰 투영 변환 행렬 직교 투영 설정 glMatrixMode(GL_PROJECTION); //현재 지정된 행렬을 단위 행렬로 재설정 glLoadIdentity; //이 영역에 그릴 OpenGL 지정 glViewPort(0, 0, ClientWidth, ClientHeight); 세계 좌표계의 범위 설정 gluOrtho2D(0, ClientWidth, ClientHeight, 0); 행렬 변환 객체를 모델 뷰 변환으로 전환 glMatrixMode(GL_MODELVIEW); //현재 지정된 행렬을 단위 행렬로 재설정 glLoadIdentity;end;
3. 그리기
OpenGL의 기본 프리미티브는 점, 선, 다각형 등입니다. 그릴 때마다 glBegin() 및 glEnd()를 사용해야 합니다. 예를 들어, 다음 그리기 기능 절차 Draw;
절차 TForm1.Draw;begin // 버퍼 지우기 glClear(GL_COLOR_BUFFER_BIT 또는 GL_DEPTH_BUFFER_BIT); // 버퍼 지우기 glColor3ub(0, 255, 0) glBegin(GL_TRIANGLES); // OpenGL에게 삼각형을 그리도록 지시합니다. glVertex2f(200, 300) ; //삼각형의 세 꼭지점 좌표를 OpenGL로 전송 glVertex2f(400, 300); glVertex2f(300, 150); //프리미티브 그리기를 종료합니다. SwapBuffers(FDC); //방금 화면에 그려진 그래픽을 복사하는 이중 버퍼의 내용을 교환합니다. 끝;
4. 마지막으로 를 릴리스하는 것을 잊지 마십시오 . 전체 코드는 다음과 같습니다.
단위 Unit1;인터페이스는 Windows, 메시지, SysUtils, 변형, 클래스, 그래픽, 컨트롤, 양식, 대화 상자, OpenGL을 사용합니다. type TForm1 = class(TForm) Procedure FormCreate(Sender: TObject); Procedure FormDestroy(Sender: TObject); 보낸 사람: TObject); 절차 FormResize(Sender: TObject); private { 개인 선언 } FDC: HDC; FHRC: HGLRC; public { 공개 선언 } end;var Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Draw;begin // 버퍼 지우기 glClear(GL_COLOR_BUFFER_BIT 또는 GL_DEPTH_BUFFER_BIT); glColor3ub(0, 255, 0); glBegin(GL_TRIANGLES);//삼각형이 그려질 것이라고 OpenGL에 알립니다. glVertex2f(200, 300); //삼각형의 세 꼭지점 좌표를 OpenGL로 전송합니다. glVertex2f(400, 300); glEnd; //그림 그리기를 종료합니다. SwapBuffers(FDC); //방금 화면에 그려진 그래픽을 복사하는 이중 버퍼의 내용을 교환합니다. end;procedure TForm1.FormCreate(Sender: TObject);var pfd:TPIXELFORMATDESCRIPTOR; pixelFormat: Integer;begin With pfd do start nSize := sizeof(TPIXELFORMATDESCRIPTOR) // size nVersion := PFD_SUPPORT_OPENGL 또는 PFD_DRAW_TO_WINDOW 또는 PFD_DOUBLEBUFFER; // 이중 버퍼링 지원 iPixelType := PFD_TYPE_RGBA; // 색상 유형 cColorBits := 24; // 선호하는 색상 깊이 cRedBits := 0; cRedShift := 0; ; cGreenShift := 0; cBlueBits := 0; cBlueShift := 0; cAlphaShift := 0; // 알파 버퍼 없음 cAccumBits := 0; // 축적 버퍼 없음(무시됨) = 0; cAccumAlphaBits := 0; cDepthBits := 16; cStencilBits := 0; // 스텐실 버퍼 없음 iLayerType := PFD_MAIN_PLANE; // 메인 레이어 bReserved := 0; dwDamageMask := 0; ; FDC := GetDC(핸들); := ChoosePixelFormat(FDC, @pfd); pixelFormat = 0이면 종료하고, 그렇지 않으면 SetPixelFormat(FDC, pixelFormat, @pfd) 종료합니다. := wglMakeCurrent(FDC, FHRC); 색상은 검정색이고 매개변수는 RGBA glClearColor(0, 0, 0, 0); //뷰 투영 변환 행렬 직교 투영 설정 glMatrixMode(GL_PROJECTION); //현재 지정된 행렬을 단위 행렬로 재설정 glLoadIdentity; //이 영역에 그릴 OpenGL 지정 glViewPort(0, 0, ClientWidth, ClientHeight) ; //세계 좌표계의 범위 설정 gluOrtho2D(0, ClientWidth, ClientHeight, 0); 행렬 변환 객체를 모델 뷰 변환으로 전환 glMatrixMode(GL_MODELVIEW); //현재 지정된 행렬을 단위 행렬로 재설정 glLoadIdentity;end;procedure TForm1.FormDestroy(Sender: TObject);begin wglMakeCurrent(FDC, FHRC); FHRC ); ReleaseDC(핸들, FDC);끝;절차 TForm1.FormPaint(Sender: TObject);begin Draw;end;procedure TForm1.FormResize(Sender: TObject);begin //창 크기가 변경될 때 그리기 영역 다시 지정 glClearColor(0, 0, 0, 0) glMatrixMode(GL_PROJECTION) ) ; glLoadIdentity; glViewPort(0, 0, ClientWidth, ClientHeight); gluOrtho2D(0, ClientWidth, ClientHeight, 0); glMatrixMode(GL_MODELVIEW); glLoadIdentity;end;end.
전체 코드를 다운로드하려면 여기를 클릭하세요.