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 (ผู้ส่ง: TObject); var pfd: TPIXELFORMATDESCRIPTOR; // เวอร์ชัน dwFlags: = PFD_SUPPORT_OPENGL หรือ PFD_DRAW_TO_WINDOW หรือ PFD_DOUBLEBUFFER; // รองรับ iPixelType แบบบัฟเฟอร์คู่ := PFD_TYPE_RGBA; // ประเภทสี cColorBits := 0; // := 0; cBlueBits := 0; cAlphaBits := 0; cAlphaShift := 0; // ไม่มีบัฟเฟอร์อัลฟ่า cAccumBits := 0; // ไม่มีการสะสมบัฟเฟอร์ cAccumAlphaBits := 0; = 0; cDepthBits := 16; // บัฟเฟอร์ความลึก cStencilBits := 0; // ไม่มีบัฟเฟอร์ลายฉลุ cAuxBuffers := 0; // ไม่มีบัฟเฟอร์เสริม iLayerType := dwDamageMask := 0; = GetDC(จัดการ); pixelFormat := เลือก PixelFormat(FDC, @pfd); ถ้า pixelFormat = 0 ให้ออก; ถ้าไม่ใช่ SetPixelFormat(FDC, pixelFormat, @pfd) ให้ออก; FHRC := wglCreateContext(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() ตัวอย่างเช่นขั้นตอนฟังก์ชันการวาดภาพต่อไปนี้ วาด;
ขั้นตอน TForm1.Draw;begin // ล้างบัฟเฟอร์ glClear(GL_COLOR_BUFFER_BIT หรือ GL_DEPTH_BUFFER_BIT); // ล้างบัฟเฟอร์ glColor3ub(0, 255, 0); // บอก OpenGL ให้วาดรูปสามเหลี่ยม glVertex2f(200, 300) ; //ส่งพิกัดจุดยอดทั้งสามของรูปสามเหลี่ยมไปที่ OpenGL glVertex2f(400, 300); glVertex2f(300, 150); //สิ้นสุดการวาดภาพของรูปแบบดั้งเดิม SwapBuffers(FDC); //สลับเนื้อหาของบัฟเฟอร์คู่ ซึ่งจะคัดลอกกราฟิกที่เพิ่งวาดไปที่หน้าจอ จบ;
4. สุดท้ายนี้ อย่าลืมปล่อย . รหัสทั้งหมดมีดังนี้:
หน่วย Unit1; อินเทอร์เฟซ Windows, ข้อความ, SysUtils, ตัวแปร, คลาส, กราฟิก, การควบคุม, แบบฟอร์ม, กล่องโต้ตอบ, OpenGL; พิมพ์ TForm1 = class (TForm) ขั้นตอน FormCreate (ผู้ส่ง: TObject); ผู้ส่ง: TObject); ขั้นตอน FormResize (ผู้ส่ง: TObject); ส่วนตัว { ประกาศส่วนตัว } FDC: HDC; FHRC: HGLRC; ขั้นตอน Draw; 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); //สลับเนื้อหาของบัฟเฟอร์คู่ ซึ่งจะคัดลอกกราฟิกที่เพิ่งวาดไปที่หน้าจอ สิ้นสุด; ขั้นตอน TForm1.FormCreate (ผู้ส่ง: TObject); var pfd: TPIXELFORMATDESCRIPTOR; pixelFormat: Integer; เริ่มต้นด้วย pfd ให้เริ่มต้น nSize := sizeof(TPIXELFORMATDESCRIPTOR); // ขนาด nVersion := 1; // version dwFlags := PFD_SUPPORT_OPENGL หรือ PFD_DRAW_TO_WINDOW หรือ PFD_DOUBLEBUFFER; // รองรับ iPixelType แบบบัฟเฟอร์คู่ := PFD_TYPE_RGBA; // ประเภทสี cColorBits := 24; // ความลึกของสีที่ต้องการ cRedShift := 0; // บิตสี (ละเว้น) ; cGreenShift := 0; cBlueShift := 0; cAlphaBits := 0; cAlphaShift := 0; // ไม่มีบัฟเฟอร์อัลฟา cAccumBits := 0; // ไม่มีการสะสมบัฟเฟอร์, cAccumGreenBits := 0; = 0; cAccumAlphaBits := 0; cDepthBits := 16; // cStencilBits := 0; // ไม่มีบัฟเฟอร์ลายฉลุ cAuxBuffers := 0; // ไม่มีบัฟเฟอร์เสริม iLayerType := dwDamageMask := 0; ; FDC := 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; ขั้นตอน TForm1.FormDestroy (ผู้ส่ง: TObject); เริ่ม wglMakeCurrent (FDC, FHRC); FHRC ); ReleaseDC (ด้ามจับ, FDC); สิ้นสุด; ขั้นตอน TForm1.FormPaint(Sender: TObject);begin Draw;end;procedure TForm1.FormResize(Sender: TObject);begin //ระบุพื้นที่การวาดใหม่เมื่อหน้าต่างเปลี่ยนขนาด glClearColor(0, 0, 0, 0); ); glLoadIdentity; glViewPort(0, 0, ClientWidth, ความสูงไคลเอ็นต์); gluOrtho2D(0, ClientWidth, ClientHeight, 0); glMatrixMode(GL_MODELVIEW); glLoadIdentity;สิ้นสุด;สิ้นสุด
คลิกที่นี่เพื่อดาวน์โหลดรหัสที่สมบูรณ์