---- เมื่อพัฒนาโปรแกรมกราฟิก โดยเฉพาะโปรแกรมกราฟิกสามมิติ ฉันเลือก DelphiOpenGL เพราะฉันรู้สึกว่า OpenGL ไม่ได้ซับซ้อนเท่ากับ DirectX ในแง่ความรู้สึก Delphi ไม่ซับซ้อนเท่ากับ C++ และใช้งานง่ายกว่า ดังนั้นฉันจึงเลือก Delphi+ OpenGL ใช้งานได้ ในระหว่างนี้ ฉันพบปัญหาบางอย่าง (แน่นอน) และฉันอยากจะแสดงความหวังว่าจะสามารถสื่อสารกับเพื่อนๆ ได้
----อย่างแรกคือการเริ่มต้น ในระหว่างการเริ่มต้น จำเป็นต้องดำเนินการหลายอย่าง: 1 สร้างตารางคำอธิบายอุปกรณ์ (บริบทอุปกรณ์) (หมายเหตุ: สำหรับ DC การแปลสื่อต่างๆ จะแตกต่างกัน เช่น สภาพแวดล้อมของอุปกรณ์ ตารางคำอธิบายอุปกรณ์ บริบทของอุปกรณ์ ฯลฯ แต่ดูเหมือนจะไม่เหมาะสมนัก คงจะดีถ้ามีนักแปลอย่าง Li Shanlan สถานการณ์ของ RC ด้านล่างจะเหมือนกัน ) ตั้งค่ารูปแบบพิกเซลที่สอดคล้องกัน (PIXELFORMAT DESCRipTOR) 3 สร้างตารางคำอธิบายการเรนเดอร์ (บริบทการเรนเดอร์) มีหลายวิธีในการรับหรือสร้างตารางบริบทของอุปกรณ์ใน Delphi วิธีที่ง่ายที่สุดคือการรับแอตทริบิวต์ handle (Handle) ของอ็อบเจ็กต์ canvas (TCanvas) โดยตรง เช่น:
DC: HDC; DC: = Canvas.Handle; คุณยังสามารถใช้ฟังก์ชัน API GetDC เพื่อรับตารางคำอธิบายอุปกรณ์ เช่น: DC:=GetDC(Handle, DC);
---- คุณยังสามารถใช้ฟังก์ชัน CreateCompatibleDC หรือ BeginPaint..EndPaint (คุณต้องใส่ใจกับความแตกต่างระหว่างกัน) เพื่อรับตารางคำอธิบายอุปกรณ์ อย่างไรก็ตาม หลังจากใช้ตารางคำอธิบายอุปกรณ์หมดแล้ว คุณต้องไม่ลืมที่จะปล่อยหรือลบตารางดังกล่าวเพื่อเพิ่มทรัพยากร เมื่อคุณเข้าถึงตารางบริบทของอุปกรณ์แล้ว คุณสามารถตั้งค่ารูปแบบพิกเซลที่เกี่ยวข้องได้ รูปแบบพิกเซลเป็นประเภทบันทึกที่มีบางฟิลด์หรือบางฟิลด์ที่ใช้งานน้อย (อย่างน้อยก็ในตอนนี้) หลังจากที่คำอธิบายรูปแบบพิกเซลเสร็จสมบูรณ์แล้ว ให้เรียกใช้ฟังก์ชัน ChoosePixelFormat และ SetPixelFormat เพื่อจับคู่และตั้งค่ากับตารางคำอธิบายอุปกรณ์ เช่นรหัสต่อไปนี้:
ฟังก์ชัน SetupPixelFormat(var dc:HDC):บูลีน;var ppfd:PPIXELFORMATDESCRIPTOR; npixelformat:จำนวนเต็ม;เริ่มต้นใหม่(ppfd); 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); ถ้า (nPixelformat=0) ให้เริ่ม MessageBox(NULL, 'choosePixelFormat failed', 'Error', MB_OK); ; ถ้า (SetPixelFormat(dc, npixelformat, ppfd)= FALSE) จากนั้นเริ่มต้น MessageBox(NULL, 'SetPixelFormat failed', '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); สิ้นสุด; nPixelFormat:=ChoosePixelFormat(DC,@pfd); ใช้ DescribePixelFormat เพื่อตรวจสอบว่ารูปแบบพิกเซลถูกตั้งค่าอย่างถูกต้องหรือไม่ DescribePixelFormat(DC,nPixelFormat,SizeOf(pfd),@pfd); if (pfd.dwFlags and PFD_NEED_PALETTE) < > 0 ดังนั้น SetupPalette(DC,pfd);//SetupPalette เป็น ฟังก์ชั่นที่กำหนดเอง } สิ้นสุด;
----หลังจากงานข้างต้นเสร็จสิ้น ควรรันอีกครั้งและตรวจสอบค่าของ 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 ขนาดของโปรแกรมที่คอมไพล์แล้วคือประมาณ 300K ในขณะที่ขนาดของโปรแกรมที่คอมไพล์ภายใต้ C++ Builder 4 คือ 384K
---- < a href="061403-05.zip ">รหัสโปรแกรม Zip 3KB
---- ฟังก์ชั่น OpenGL และรูปแบบพิกเซลในโปรแกรมมีการอธิบายโดยละเอียดใน MSHelp ใน Delphi บทความนี้ไม่กล้าอธิบายเพิ่มเติม