. . . . . .อะแฮ่ม !! นานทีเดียวกว่าเนื้อหาการเขียนโปรแกรมกราฟฟิกจะออกได้ แหะ แหะ เกมที่เราเล่นนั้น จะต้องตอบสนอง และแสดงผลได้อย่างรวดเร็ว ยิ่งเกมที่มีความสลับซับซ้อนด้วยแล้ว ยิ่งต้องการความเร็วในการแสดงผลมากทีเดียว แต่ปางก่อน. นู้น............ สมัยที่ 486 ยังเด็กๆ เกมที่เราเล่นจะมีความละเอียดที่ 320x200 เม็ดสีโตๆ หยาบๆ แต่เราก็เล่นมันมาหลายเกมทีเดียว C&C นี่เลย ใครเคยเล่นภาคแรกคงจะทำได้ รถเก็บแร่เราตัวบะเอ๊บ !!และอีกเกม DUNE2 งัย WARNING WORM SAND !! จำกันได้อ๊ะเปล่า สารพัด UNIT ที่เราสร้างๆแล้วก็สร้าง แล้วก็รุมกินโต๊ะมัน !! โฮ่ โฮ่ DOOM ตูมๆๆ เราก็เล่นกันจนละเมอจนบ้าไปเลย นี่ถ้าจะถอยลงไปอีกรุ่น APPLE เลย คงม่ายหวาย ไม่เด็กแล้ว ยังไม่เกิดเลยครับ ระยะเวลา 4 ปีมานี่ พัฒนาการของคอมพิวเตอร์ พัฒนาไปรวดเร็วมาก.......จนตามไม่ทัน แต่ก็เป็นประโยชน์กับการเล่นเกมมากทีเดียว เพราะเครื่องก็เร๊ว..เร็ว.. จอก็หย่าย......แสดงผลรวดเร็ว.... ยิ่งใครมีการ์ดเร่งความเร็ว 2D/3D ด้วยนะสุดยอดไปเลย RAM เยอะๆ 32M, 64M 128M ยิ่งอุปกรณ์ต่อพ่วงอีก โอย ตรึม !! เกมในปัจจุบันแสดงผลที่ 640x480 256 สี บ้างก็ 16Bits สี ไม่ก็ 24Bits ไปเลย แต่ยิ่งความละเอียดมาก สีมาก ก็ยิ่งทำให้การแสดงผลช้าลงด้วยนะครับ เพราะหลักการแสดงจุดบนจอภาพ ยิ่งขั้นตอนมากยิ่งช้า และถ้าการ์ดเก่าๆ จะเดอะไปเล่น 24Bits สีคง ทุลักทุเลหน่อยละ ก่อนหน้านั้นผลใช้ Turbo pascal กับ BGI ใครรู้ทั่งมันคืออะไร มันคือ Borland Graphice Interface (BGI) งัย สำหรับแสดงภาพกราฟฟิกมีเครื่องมือให้ใช้ครบครับ แต่ ช้า............มาก ผมก็เขียนแบบ 640x480 16 สีก่อน ไปๆมาๆสีไม่พอ เปลี่ยนมาเป็น 256 สี ก็อืม....ใช้ได้ แต่ได้ที่ 320x200 เพราะยิ่งสีเยอะก็ยิ่งช้า ตอนนั้นใช้ 486DX2 ที่ห้องเรียนแห่งหนึ่ง นั่งเขียนโปรแกรมเคาะตัวละคร ก็เคาะๆ ได้มาตัวนึง ทำกำแพง คบเพลิง เออ แฮะ ได้ แล้วเอามาเดินๆ ก็ได้นะ Turbo pascal 5.0 นี่ละ แต่ยังไม่สะใจ เลยหาเอกสารเพิ่มเติมต่อจนทิ้งช่วงไปปีกว่าๆ เพราะกำลังทำงาน และกำลังเรียนตอนนั้น ปวช.1 ผ่านไปจบแล้ว...ได้วิชาติดตัวมาเองคือ Turbo pascal และ GWBASIC จากนั้นก็ทำงานเลย เป็นงานเขียนโปรแกรมเช่นกัน ใช้เวลาทำงานนั่นละศึกษา รู้จัก Internet ก็ download demo และ source code มาศึกษาจนเช้าเลยละ ช่วงนั้นทำงานหนักมาก.....เพราะไม่รู้อะไรเลย ยังกระจอกอยู่ ใช้เวลาพัฒนาระบบ และเครื่องมือกราฟฟิก 2 ปีกว่าๆ ก็ได้วิชาดีติดตัวมา จากนั้นลาอาจารย์กลับเมือง เอ๊ย !! ม่ายช่ายๆ ยังอยู่ๆ วุ๊ย !! ผมรวมรวมเอกสารจากทั่วโลกมาที่ HD ผม ผมไปเที่ยวต่างประเทศบ่อยมาก อเมริกาบ้าง ยุโรปบ้าง แต่ญี่ปุ่นไปบ่อยที่สุด เหอ เหอ ไปมาหลายที่ก็จะมาให้เพื่อนๆได้ศึกษากันต่อ ผมนักเรียนนอกนะ นอกลู่นอกทาง ฮ่า ฮ่า ฮ่า เอาละมาดูระบบกราฟฟิก 2D กันว่าทำกันยังงัยบ้าง...... |
. . . . . .ก่อนที่เราจะเขียนหน่วยความจำของการ์ดแสดงผลโดยตรง เราต้องรู้ขนาดของข้อมูลก่อนซึ่งแบ่งออกได้แบบนี้ |
. . . . . .จากรูปภาพข้างบนนี้ นี่คือขนาดของข้อมูลที่เราจะใช้ และที่แบ่งเป็นสีๆ คือแม่สีทั้งสามคือ แดง, เขียว, น้ำเงิน เวลาเราจะแสดงจุดบนจอภาพเราต้องให้ค่าสีก่อนมีค่าระหว่าง 0 - 255 0 นี่มืดตื๋อส่วน 255 นี่สว่างจ้าครับ การปรับค่าแม่สีทั้งสามจะทำให้เกิดสีต่างๆนาๆ ส่วนที่เห็นเป็นสีน้ำเงินล้วนที่มีค่า 8 Bits นั้นมีค่าระหว่าง 0 - 255 ใช้ในโหมดการแสดงผลที่ 256 สี และเป็นเพียง Index สีเท่านั้น ไม่ใช่การผสมสี RGB แต่อย่างไร กล่าวคือถ้าในโหมด 256 สี จะมีตารางสีให้ใช้งานอยู่แล้วมีขนาด 768 Bytes คือ แม่สีทั้ง 3 คูน 256 = 768 Bytes งัย เป็นตารางที่ผสมสีไว้แล้ว จำกัดเพียง 256 สีเท่านั้น เราเพียงแต่อ้างสีที่ต้องการเฉยๆ สามารถเปลี่ยนแปลงได้ แต่ถ้าเปลี่ยนแล้วจะกระทบค่าสีอื่นๆ ด้วย เช่นถ้าเราเปลี่ยนสีที่ 10 ส่วนที่แสดงผลไปแล้วที่มีค่า 10 จะเปลี่ยนแปลงไปด้วยทั้งจอ เทคนิคนี้ ใช้ในเรื่องการเฟด หรือ การค่อยๆลดสีลงจนมืดไป แบบๆค่อยๆลดความสว่างของจองัย get ยัง ส่วนการผสมสีในตารางนั้นก็ไม่ยากอะไร แม่สีทั้งสามค่าระหว่าง 0 - 255 ผสมลงไปเลย ต่อมาเป็น 16 Bits สี สามารถแสดงผลได้ 65536 สี ตรงนี้สามารถ แบ่งออกได้เป็น 15 Bits สี คือ 32768 สีอีกด้วย และค่าที่เราจะให้คือการอัดแม่สีทั้งสามลงไป ยังงัยละ ตรงนี้ต้องเข้าไปถึงระบบ BIT ทีเดียว ดูรูปข้างล่างครับ |
. . . . . .จากรูปข้างบนจะเห็นได้ว่าใน 16Bits ประกอบไปด้วยค่าของแม่สีทั้งสามประกอบไปด้วยแดง เขียน และน้ำเงิน และตัวเลข 32, 64, 32 นั้นคือจำนวนค่าสูงสุดของแม่สีนั้น ระหว่าง 0 - 31 หรือ 0 - 63 แล้วก็อัดค่าเหล่านั้นเข้าไป เทคนิคการอัดค่าก็ไม่ยากอะไร ลองดูโปรแกรม |
unsigned short wColor =
Red; wColor <<= 5; wColor |= Green; wColor <<= 6; wColor |= Blue; |
. . . . . .แต่ แต่ แต่ แม่สีแต่ละสีต้องมีค่าไม่เกิน 32-64-32 ไม่ใช่สัดส่วนเอว 26 อก 35 นะครับนะครับ ฮ่า ฮ่า หมายความว่า สีแดงมีค่าระหว่าง 0 - 31 สีเขียวมีค่าระหว่าง 0 -61 และ สีน้ำเงินมีค่าระหว่าง 0 - 31 เราต้องแปลงค่าสีระหว่าง 0 - 255 ให้มีค่าระหว่าง 32-64-32 แบบนี้ครับ ใช้สูตรอัตราส่วนก็ได้ครับ |
R = (Red * 32) / 256; G = (Green * 64) / 256; B = (Blue * 32) / 256; |
. . . . . .แต่ผมมีเทคนิคที่เจ๋งกว่านั่น เร็วกว่าด้วยการเลื่อน BIT ครับ ถ้าเลื่อนไปทางซ้ายคือการคูณ ถ้าทางขวาคือการหารครับ ถ้าเลื่อนไปทางซ้าย 1 คือ คูณ 2 ถ้าเลื่อนไปทางซ้าย 2 คือคูณ 4 ถ้าเลื่อนไปทางขวา 1 คือหารสองครับ เพราะค่าประจำBIT มีค่าเท่ากับยกกำลังสองครับ เช่น 1 2 4 8 16 32 64 128 256 และเทคนิคนี้เป็นที่นิยมกันทั่วโลก ไม่ต้องคูณหารให้เสียเวลาครับ มาดูโปรแกรม |
R = (Red << 5) >> 8; G = (Green << 6 ) >> 8; B = (Blue << 5) / >> 8; |
. . . . . .จากนั้นเราก็นำค่าเหล่านี้ไปอัดลงไปในตัวแปร 16 Bits ครับ ก่อนที่จะย้ายไปยังหน่วยความจำของการ์ด ต่อไปโหมด 15Bits 32568 สี มีขั้นตอนเหมือนๆกับ 16Bits เพียงแต่เปลี่ยนอะไรนิดหน่อย แม่สีทุกสีจะมีค่าเท่ากันคือระหว่าง 0 - 31 ส่วน BIT สุดท้ายนั้นว่างไว้ครับ ไม่ต้องไปยุ่งมัน มาดูตัวโปรแกรมครับ เป็นแบบใช้งานนะครับ ดูรูปประกอบด้วยครับ |
ีunsigned short wColor
= (Red << 5) >> 8; wColor <<= 5; wColor |= (Green << 5) >> 8; wColor <<= 5; wColor |= (Blue << 5) >> 8; |