git clone https://github.com/ssloy/tinyrenderer.git &&
cd tinyrenderer &&
mkdir build &&
cd build &&
cmake .. &&
cmake --build . -j &&
./tinyrenderer ../obj/diablo3_pose/diablo3_pose.obj ../obj/floor.obj
ภาพที่เรนเดอร์จะถูกบันทึกไว้ใน framebuffer.tga
คุณสามารถเปิดโปรเจ็กต์ใน Gitpod ซึ่งเป็นสภาพแวดล้อมการพัฒนาออนไลน์ฟรีสำหรับ GitHub:
เมื่อเปิดขึ้นมา โปรแกรมแก้ไขจะคอมไพล์และรันโปรแกรม รวมถึงเปิดภาพที่ได้ในหน้าตัวอย่างของโปรแกรมแก้ไข เพียงเปลี่ยนโค้ดในตัวแก้ไขและรันสคริปต์อีกครั้ง (ใช้ประวัติของเทอร์มินัล) เพื่อดูภาพที่อัปเดต
ซอร์สโค้ดของฉันไม่เกี่ยวข้อง อ่านวิกิและใช้ตัวเรนเดอร์ของคุณเอง เมื่อคุณต้องทนทุกข์ทรมานกับรายละเอียดเล็กๆ น้อยๆ คุณจะได้เรียนรู้ว่าเกิดอะไรขึ้น
ในบทความชุดนี้ ฉันต้องการแสดงให้เห็นว่า OpenGL ทำงานอย่างไรโดยการเขียนโคลนของมัน (แบบที่เรียบง่ายมาก) น่าประหลาดใจที่ฉันมักจะพบกับผู้คนที่ไม่สามารถเอาชนะอุปสรรคในการเรียนรู้ OpenGL / DirectX ในช่วงเริ่มต้นได้ ดังนั้นฉันจึงเตรียมชุดการบรรยายสั้นๆ หลังจากนั้นนักเรียนของฉันจะแสดงการเรนเดอร์ที่ค่อนข้างดี
ดังนั้นงานจึงมีการกำหนดดังนี้: ไม่ใช้ไลบรารีของบุคคลที่สาม (โดยเฉพาะกราฟิก) จะได้สิ่งที่ต้องการตามรูปภาพนี้:
คำเตือน: นี่เป็นสื่อการฝึกอบรมที่จะทำซ้ำโครงสร้างของไลบรารี OpenGL อย่างหลวมๆ มันจะเป็นซอฟต์แวร์เรนเดอร์ ฉันไม่ต้องการแสดงวิธีเขียนแอปพลิเคชันสำหรับ OpenGL ฉันต้องการแสดงให้เห็นว่า OpenGL ทำงานอย่างไร ฉันเชื่อมั่นอย่างยิ่งว่าเป็นไปไม่ได้ที่จะเขียนแอปพลิเคชันที่มีประสิทธิภาพโดยใช้ไลบรารี 3D หากไม่เข้าใจสิ่งนี้
ฉันจะพยายามสร้างโค้ดสุดท้ายประมาณ 500 บรรทัด นักเรียนของฉันต้องใช้เวลา 10 ถึง 20 ชั่วโมงในการเขียนโปรแกรมเพื่อเริ่มสร้างโหมดเรนเดอร์ดังกล่าว ที่อินพุต เราได้รับไฟล์ทดสอบที่มีเส้นลวดเหลี่ยม + รูปภาพพร้อมพื้นผิว ที่เอาต์พุต เราจะได้โมเดลที่เรนเดอร์แล้ว-ไม่มีอินเทอร์เฟซแบบกราฟิก และโปรแกรมก็สร้างรูปภาพขึ้นมา
เนื่องจากเป้าหมายคือเพื่อลดการพึ่งพาจากภายนอก ฉันจึงให้ชั้นเรียนเดียวแก่นักเรียนที่อนุญาตให้ทำงานกับไฟล์ TGA ได้ เป็นหนึ่งในรูปแบบที่ง่ายที่สุดที่รองรับภาพในรูปแบบ RGB/RGBA/ขาวดำ เพื่อเป็นจุดเริ่มต้น เราจะได้วิธีง่ายๆ ในการทำงานกับรูปภาพ คุณควรทราบว่าฟังก์ชันเดียวที่มีให้ตั้งแต่เริ่มต้น (นอกเหนือจากการโหลดและบันทึกรูปภาพ) คือความสามารถในการตั้งค่าสีของพิกเซลหนึ่งพิกเซล
ไม่มีฟังก์ชันสำหรับการวาดส่วนของเส้นตรงและสามเหลี่ยม เราจะต้องทำทั้งหมดนี้ด้วยมือ ฉันจัดเตรียมซอร์สโค้ดที่ฉันเขียนร่วมกับนักเรียน แต่ฉันไม่แนะนำให้ใช้เพราะมันไม่สมเหตุสมผล โค้ดทั้งหมดมีอยู่ใน GitHub และคุณจะพบซอร์สโค้ดที่ฉันมอบให้นักเรียนที่นี่
# include " tgaimage.h "
const TGAColor white = TGAColor( 255 , 255 , 255 , 255 );
const TGAColor red = TGAColor( 255 , 0 , 0 , 255 );
int main ( int argc, char ** argv) {
TGAImage image ( 100 , 100 , TGAImage::RGB);
image. set ( 52 , 41 , red);
image. write_tga_file ( " output.tga " );`
return 0 ;
}
output.tga ควรมีลักษณะดังนี้: