Fixed-Function vs Shaders: อันไหนสำหรับมือใหม่?


16

ฉันกำลังจะไปวิทยาลัยเพื่อวิทยาการคอมพิวเตอร์ แม้ว่าฉันจะวางแผนที่จะใช้เครื่องมือที่มีอยู่ในบางจุดเพื่อสร้างเกมเล็ก ๆ จุดมุ่งหมายของฉันในตอนนี้คือการเรียนรู้พื้นฐาน: การเขียนโปรแกรมสามมิติ ฉันได้ทำการวิจัยเกี่ยวกับตัวเลือกระหว่าง DirectX และ OpenGL แล้วและความเชื่อมั่นทั่วไปที่เกิดขึ้นจากการที่ไม่ว่าคุณจะเลือก OpenGL หรือ DirectX เป็นแพลตฟอร์มการฝึกอบรมล้อของคุณความรู้มากมายสามารถถ่ายโอนไปยังแพลตฟอร์มอื่นได้ . ดังนั้นเนื่องจาก OpenGL ได้รับการสนับสนุนโดยระบบเพิ่มเติม (อาจเป็นเหตุผลที่โง่ในการเลือกสิ่งที่จะเรียนรู้) ฉันตัดสินใจว่าฉันจะเรียนรู้ OpenGL ก่อน

หลังจากฉันตัดสินใจที่จะเรียนรู้ OpenGL ฉันได้ทำการวิจัยเพิ่มเติมและพบว่ามีความแตกต่างที่ฉันไม่ทราบมาตลอดเวลานี้: OpenGL ที่ใช้กับโปรแกรมได้อย่างคงที่ ตอนแรกฉันคิดว่ามันเป็นตัวเลือกที่ชัดเจนที่ฉันควรเลือกเรียนรู้ OpenGL ที่อิงกับ shader เนื่องจากเป็นสิ่งที่ใช้กันมากที่สุดในอุตสาหกรรมปัจจุบัน อย่างไรก็ตามฉันก็พบกับการเขียนโปรแกรมการเรียนรู้กราฟิก 3D Modernยอดนิยมโดย Jason L. McKesson ซึ่งอยู่ที่นี่: http://www.arcsynthesis.org/gltut/

ฉันอ่านถึงช่วงเกริ่นนำและในส่วน "เกี่ยวกับหนังสือเล่มนี้" ผู้เขียนกล่าวว่า:

"สิ่งแรกคือสิ่งที่เรียนรู้ด้วยวิธีนี้จะต้องถูกยกเลิกอย่างหลีกเลี่ยงไม่ได้เมื่อผู้ใช้พบปัญหากราฟิกที่ต้องแก้ไขด้วยความสามารถในการโปรแกรมความสามารถในการเขียนโปรแกรมจะทำความสะอาดท่อฟังก์ชั่นคงที่เกือบทั้งหมด

แต่ในเวลาเดียวกันก็ทำให้กรณีที่ฟังก์ชันการทำงานคงที่ให้เส้นโค้งการเรียนรู้ที่ง่ายขึ้นและรวดเร็วขึ้นสำหรับผู้เริ่มต้นโดยระบุ:

"โดยทั่วไปถือว่าง่ายที่สุดในการสอนโปรแกรมเมอร์กราฟิก neophyte โดยใช้ฟังก์ชั่นฟังก์ชั่นคงที่"

โดยธรรมชาติแล้วคุณจะเห็นว่าทำไมฉันถึงขัดแย้งกันเกี่ยวกับกระบวนทัศน์ที่จะเรียนรู้: ฉันใช้เวลาในการเรียนรู้มากมาย (และหลังจากนั้นไม่เปิดเผย) วิธีการใช้งานคงที่หรือไม่หรือฉันเลือกที่จะเริ่มต้นด้วยเฉดสี ข้อกังวลหลักของฉันคือผู้ที่ตั้งโปรแกรมได้อย่างทันสมัยต้องการให้โปรแกรมเมอร์เข้าใจถึงฟังก์ชั่นไปป์ไลน์แล้ว แต่ฉันสงสัยว่าเป็นเช่นนั้น

TL; DR = ในฐานะที่เป็นโปรแกรมเมอร์กราฟิกเกมที่ต้องการมันเป็นความสนใจที่ดีที่สุดของฉันในการเรียนรู้การเขียนโปรแกรม 3D ผ่านการใช้งานคงที่หรือการเขียนโปรแกรมที่ใช้ Shader สมัยใหม่หรือไม่?


มีคำถามที่คล้ายกันกับเรื่องนี้เช่นกัน ...
ไม่ใช่เนื้อหนัง

"ในขณะเดียวกันก็ทำให้กรณีที่ฟังก์ชั่นคงที่ให้เส้นโค้งการเรียนรู้ที่ง่ายขึ้นและเร็วขึ้นสำหรับผู้เริ่มต้นโดยระบุว่า:" ฉันอยากรู้ สิ่งนี้ทำให้เกิดขึ้นได้อย่างไร เนื่องจากคำพูดพูดอย่างชัดเจนว่า " โดยทั่วไปถือว่าง่ายที่สุด ... " (เน้นที่การเพิ่ม) ในขณะที่มันอาจจะถือว่าเป็นจริง แต่ไม่ได้หมายความว่ามันเป็นเรื่องจริง
Nicol Bolas

ใช่นั่นเป็นวิธีที่งุ่มง่ามในการใช้ถ้อยคำนั้น
Rob Hays

ไปป์ไลน์ฟังก์ชันคงที่ถูกคัดค้านทั้งใน OpenGL และ DirectX ดังนั้นฉันจะไม่เสียเวลากับมัน เฉดสีพื้นฐานนั้นค่อนข้างตรงไปตรงมาและแน่นอนว่าไม่ซับซ้อนเกินกว่าความเข้าใจเพียงพอที่จะทำให้บริบทของการเรนเดอร์ทำงานได้
3Dave

คำตอบ:


30

ฉันไม่ซื้ออาร์กิวเมนต์ที่ง่ายกว่าในการเริ่มต้นด้วยฟังก์ชั่นคงที่ อาจเป็นกรณีที่ฟังก์ชั่นคงที่ช่วยให้คุณทำบางสิ่งด้วยรหัสน้อย - ในฟังก์ชั่นคงที่ OpenGL ตัวอย่างเช่นคุณสามารถรับแสง / เงาขั้นพื้นฐานได้โดยการglEnable(GL_LIGHTING)โทรและโทรอื่น ๆ ปัญหาก็คือทันทีที่คุณต้องการบางสิ่งที่แตกต่างออกไปเล็กน้อย - ต่อแสงพิกเซลพูดแทนแสงต่อจุดสุดยอด - คุณต้องละทิ้งฟังก์ชั่นคงที่ทั้งหมดและเขียน shader ที่จะใช้ทั้งฟังก์ชั่นคงที่ที่คุณใช้ ก่อนหน้ารวมทั้งสิ่งที่คุณต้องการเปลี่ยน

ดูเหมือนว่าจะง่ายกว่าและสับสนน้อยกว่าที่จะใช้เครื่องเคลือบเงาตลอดเวลา Shaders ต้องการการตั้งค่าอีกเล็กน้อยเนื่องจากคุณมีไฟล์ต้นฉบับแยกต่างหากที่ต้องโหลดและรวบรวมการโทร C พิเศษเพื่อค้นหาและตั้งค่าพารามิเตอร์ ฯลฯ แต่เมื่อคุณมี shader ต่อไปมันเป็นสิ่งที่ง่ายที่สุด เพื่อเขียนโค้ดเอฟเฟ็กต์ต่าง ๆ ลองใช้แนวคิดที่แตกต่างกัน ฯลฯ และคุณไม่จำเป็นต้องสนใจว่าขีด จำกัด ของระบบฟังก์ชั่นคงที่อยู่ที่ใดและสามารถทำหรือไม่สามารถทำสิ่งที่คุณต้องการได้ shaders สามารถทำอะไรก็ได้ที่คุณสามารถเขียนโค้ดได้โมดูโล จำกัด ประสิทธิภาพและหน่วยความจำตามปกติ


เยี่ยมขอบคุณสำหรับการตอบกลับ ฉันน่าจะจบลงด้วยการถูกต้องสำหรับผู้ให้บริการ
Rob Hays

3
+1 - มันก็เหมือนกับ "Learning C ++" เทียบกับ "Learning BASIC" จะใช้เวลาคุณนานกว่าในการเรียนรู้ C ++ แต่คุณจะได้เรียนรู้มากขึ้นในระยะยาว
Jonathan Dickinson

3
ผมอยากจะแนะนำให้opengl-tutorial.org เว็บไซต์อธิบายพื้นฐานค่อนข้างดีและใช้ shaders เท่านั้น
Exilyth

3

ฉันจะบอกว่าจะเริ่มต้นด้วยฟังก์ชั่นคงที่ใน GLUT ฉันจะไม่พูดอะไรเกี่ยวกับเรื่องนี้มากนัก แต่แนวคิดเบื้องหลัง shaders ค่อนข้างซับซ้อนและความรู้ที่จำเป็นคือการเขียนโปรแกรม 3 มิติขั้นพื้นฐาน (เช่นการสร้างจุดยอดและเมทริกซ์การแปลง ฯลฯ ) มีสถานที่อีกมากมายที่คุณสามารถพลาดได้โดยการใช้เฉดสีมีโค้ดอีกมากมาย

ลองดูบทช่วยสอนของฉันและเหล่านี้lighthouse3dคน


2

ฉันจะไปทางที่สอง มันไม่ได้จริงๆที่ยากมากที่จะตั้งค่าและเมื่อคุณผ่านที่กีดขวางแรกคุณมีอำนาจเต็มรูปแบบปลายนิ้วของคุณ

ยิ่งไปกว่านั้นคุณจะพบว่าการเขียนโปรแกรม shader ตรงกับสมการทางคณิตศาสตร์ที่คุณเห็นในหนังสือและการบรรยายกราฟิกที่วิทยาลัยอย่างใกล้ชิดยิ่งขึ้น


0

ฉันอยากจะแนะนำให้ใช้ฟังก์ชั่นไปป์ไลน์แบบตายตัวเป็นกระดูกสันหลังของโปรแกรมของคุณ ฉันคิดว่ามันง่ายกว่าที่จะมีบางสิ่งบางอย่างปรากฏขึ้นโดยใช้มันแทนที่จะเป็นเงาอย่างหมดจด จากนั้นเมื่อคุณรู้ว่าคุณไม่ได้ยุ่งเหยิงจุดยอดหรือบรรทัดฐานของคุณคุณสามารถช้า แต่แน่นอนวิธีการของคุณเข้าสู่โลกที่แรเงา

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.