Delphi 에서 OpenGL2d 그림 그리 기 초기 화 프로 세 스 상세 설명
Delphi 는 기본적으로 OpenGl 을 지원 하 며 uses OpenGL 단원 을 사용 하여 인용 할 수 있 으 며,이후 OpenGL 함 수 를 사용 할 수 있 습 니 다.OpenGl 은 크로스 플랫폼 이 고 Windows 는 일찍부터 시스템 에 지원 되 고 통합 되 었 으 며 시스템 32 에 존재 하 는 opengl 32.dll 은 추가 로 설치 할 필요 가 없습니다.windows 자체 에 d3d 가 있 지만 그 능력 에 한계 가 있 고 관련 학습 자료 페이지 가 상대 적 으로 적다.
일반적으로 OpenGL 은 다음 과 같은 몇 가지 기본 기하학 적 도형 만 지원 합 니 다:점,선,다각형.표면 이나 더 높 은 도형(예 를 들 어 구형 도형)이 없 으 면 기본 도형 요소 로 그 릴 수 있다.하지만 다각형 으로 완벽 하 게 흉 내 낼 수 있다.현대 3D 게임 을 마음대로 보면 거의 삼각형 으로 만들어 진 것 을 발견 할 수 있 을 것 이다.따라서 우 리 는 이 제한 에 얽 매 이지 않 을 것 이다.
초기 화
OpenGL 을 사용 하기 전에 관련 매개 변수 설정 이 필요 합 니 다.일반 프로 세 스:
"일치 하 는 픽 셀 형식 설정"(ChoosePixelFormat,SetPixelFormat)
"OpenGL 렌 더 링 설명 표를 새로 만 듭 니 다"(wglCreate Context)
"OpenGL 관련 인자 설정","그림 그리 기"(glBegin,glEnd)
"OpenGL 렌 더 링 설명 표 삭제"(wglDeleteContext)
procedure TForm1.FormCreate(Sender: TObject);
var
pfd:TPIXELFORMATDESCRIPTOR;
pixelFormat: Integer;
begin
With pfd do
begin
nSize := sizeof(TPIXELFORMATDESCRIPTOR); // size
nVersion := 1; // version
dwFlags := PFD_SUPPORT_OPENGL or PFD_DRAW_TO_WINDOW or PFD_DOUBLEBUFFER; // support double-buffering
iPixelType := PFD_TYPE_RGBA; // color type
cColorBits := 24; // preferred color depth
cRedBits := 0;
cRedShift := 0; // color bits (ignored)
cGreenBits := 0;
cGreenShift := 0;
cBlueBits := 0;
cBlueShift := 0;
cAlphaBits := 0;
cAlphaShift := 0; // no alpha buffer
cAccumBits := 0;
cAccumRedBits := 0; // no accumulation buffer,
cAccumGreenBits := 0; // accum bits (ignored)
cAccumBlueBits := 0;
cAccumAlphaBits := 0;
cDepthBits := 16; // depth buffer
cStencilBits := 0; // no stencil buffer
cAuxBuffers := 0; // no auxiliary buffers
iLayerType := PFD_MAIN_PLANE; // main layer
bReserved := 0;
dwLayerMask := 0;
dwVisibleMask := 0;
dwDamageMask := 0;
end;
FDC := GetDC(Handle);
pixelFormat := ChoosePixelFormat(FDC, @pfd);
if pixelFormat = 0 then
Exit;
if not SetPixelFormat(FDC, pixelFormat, @pfd) then
Exit;
FHRC := wglCreateContext(FDC);
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;
그림OpenGL 의 기본 그림 은 점,선,다각형 등 으로 그림 을 그 릴 때마다 glBegin()과 glEnd()를 사용 해 야 합 니 다.아래 와 같이 함수 procedure Draw 그리 기;
procedure TForm1.Draw;
begin
//
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
//
glColor3ub(0, 255, 0);
glBegin(GL_TRIANGLES);// OpenGL
glVertex2f(200, 300); // OpenGL
glVertex2f(400, 300);
glVertex2f(300, 150);
glEnd; // 。
SwapBuffers(FDC); // , 。
end;
4.마지막 으로 석방 하 세 요.모든 코드 는 다음 과 같 습 니 다:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, OpenGL;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure FormResize(Sender: TObject);
private
{ Private declarations }
FDC: HDC;
FHRC: HGLRC;
procedure Draw;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Draw;
begin
//
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
//
glColor3ub(0, 255, 0);
glBegin(GL_TRIANGLES);// OpenGL
glVertex2f(200, 300); // OpenGL
glVertex2f(400, 300);
glVertex2f(300, 150);
glEnd; // 。
SwapBuffers(FDC); // , 。
end;
procedure TForm1.FormCreate(Sender: TObject);
var
pfd:TPIXELFORMATDESCRIPTOR;
pixelFormat: Integer;
begin
With pfd do
begin
nSize := sizeof(TPIXELFORMATDESCRIPTOR); // size
nVersion := 1; // version
dwFlags := PFD_SUPPORT_OPENGL or PFD_DRAW_TO_WINDOW or PFD_DOUBLEBUFFER; // support double-buffering
iPixelType := PFD_TYPE_RGBA; // color type
cColorBits := 24; // preferred color depth
cRedBits := 0;
cRedShift := 0; // color bits (ignored)
cGreenBits := 0;
cGreenShift := 0;
cBlueBits := 0;
cBlueShift := 0;
cAlphaBits := 0;
cAlphaShift := 0; // no alpha buffer
cAccumBits := 0;
cAccumRedBits := 0; // no accumulation buffer,
cAccumGreenBits := 0; // accum bits (ignored)
cAccumBlueBits := 0;
cAccumAlphaBits := 0;
cDepthBits := 16; // depth buffer
cStencilBits := 0; // no stencil buffer
cAuxBuffers := 0; // no auxiliary buffers
iLayerType := PFD_MAIN_PLANE; // main layer
bReserved := 0;
dwLayerMask := 0;
dwVisibleMask := 0;
dwDamageMask := 0;
end;
FDC := GetDC(Handle);
pixelFormat := ChoosePixelFormat(FDC, @pfd);
if pixelFormat = 0 then
Exit;
if not SetPixelFormat(FDC, pixelFormat, @pfd) then
Exit;
FHRC := wglCreateContext(FDC);
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);
wglDeleteContext(FHRC);
ReleaseDC(Handle, FDC);
end;
procedure 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.
전체 코드 점
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[Delphi] TStringBuilder그리고 꼭 사용해야만 할까? 그림처럼 Heap 영역에 "Hello" 공간을 생성하고 포인팅을 한다. "Hello World" 공간을 새로 생성한 후 포인팅을 하게 된다. 결국 "Hello" 라는 String 객체가 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.