ฉันคิดว่าฉันได้สิ่งที่คุณต้องการถาม ฉันถือว่าความกังวลหลักของคุณคือตัวแปรที่ไม่สม่ำเสมอที่กำหนดไว้นอกmain()
:
float left;
float right;
float mscaled;
float xn;
float xm;
ลองมาดูกันว่า GPU และ GLSL ทำงานอย่างไร GPU ไม่มีสแต็กหรือบันทึกการเปิดใช้งานการโทร ไม่มีวิธีจำลองขอบเขตหรือตัวแปรในท้องถิ่นใน GLSL เหมือนกับคอมไพเลอร์ C ที่สามารถทำได้บน CPU ส่วนใหญ่ สิ่งที่มีอยู่ทั้งหมดคือรีจิสเตอร์ซึ่งเป็นรีจิสเตอร์ที่เหมือนกันอินพุตอินเตอรเฟสของ shader สเตอรเอาตพุตและไฟลลงทะเบียนโลคัลที่ไมซ้ำกัน
กล่าวอีกนัยหนึ่งเมื่อไม่มีสิ่งใดเช่นฟังก์ชั่นหรือกองซ้อนหรือกองตัวแปรทั้งหมดที่ประกาศอยู่ที่ใดก็ได้ในการลงทะเบียน ไม่ว่าพวกเขาจะอยู่ในขอบเขตบางส่วนใน GLSL หรือทั่วโลกต่อไฟล์ทั้งหมดก็ไม่ต่างอะไร พวกเขาแค่ลงทะเบียน
อย่างไรก็ตามตัวจัดสรรการลงทะเบียนไม่ได้เป็นส่วนหนึ่งของมาตรฐาน GLSL การใช้งาน OpenGL ที่แตกต่างกันอาจมีระดับคุณภาพที่แตกต่างกันเมื่อพูดถึงการแปลงรหัส GLSL ระดับสูงเป็นรหัสเครื่องระดับต่ำที่ GPU เข้าใจ หนึ่งในส่วนที่มีความซับซ้อนมากขึ้นของคอมไพเลอร์ (GLSL หรืออื่น ๆ ) คือการจัดสรรลงทะเบียน นี่เป็นส่วนหนึ่งของคอมไพเลอร์ที่กำหนดว่าการลงทะเบียนตัวแปรที่กำหนดไว้ตรงไหน C ค่อนข้างยากกว่าปกติเนื่องจากต้องจัดการกับไฟล์ register ขนาดเล็กมาก (โดยเฉพาะบน x86) และต้องจัดการกับ register spilling (ย้ายตัวแปรไปยัง stack) และ aliasing (บันทึกตัวแปรกลับไปที่ RAM ก่อนเรียกฟังก์ชัน) และ คำสั่งแบบคี่ซึ่งต้องการเอาต์พุตจะอยู่ใน register เฉพาะ (x86's)idiv
ตัวอย่าง) GPU มีไฟล์ register ขนาดใหญ่ ish เนื่องจากไม่มี stack หรือ heap ดังนั้นตัวจัดสรรสามารถทำได้ง่ายกว่า
อย่างไรก็ตามไฟล์ลงทะเบียนนั้นไม่มีที่สิ้นสุด หากคุณมีตัวแปรมากกว่าการลงทะเบียนที่สนับสนุนโดยฮาร์ดแวร์ของคุณคอมไพเลอร์จะต้องลองใช้ตัวแปรทั้งหมดในรีจิสเตอร์ ซึ่งมักจะต้องใช้การตรวจสอบช่วงชีวิตรูปแบบบางอย่าง นั่นคือถ้าคุณใช้ตัวแปรxn
สำหรับการคำนวณหนึ่งครั้งอย่าใช้มันอีกครั้งคอมไพเลอร์สามารถกำหนดสิ่งนี้และทราบว่าการลงทะเบียนที่ครอบครองโดยxn
สามารถใช้ตัวแปรอื่นได้ในภายหลังดังนั้นจึงอนุญาตให้ใช้ตัวแปรมากกว่าที่มีการลงทะเบียน เนื่องจากมีตัวแปรสดไม่มากในคราวเดียว)
คอมไพเลอร์อาจไม่ทำเช่นนี้ มันไม่มี หรืออาจทำในบางกรณีเท่านั้น ขอบเขตที่ให้คอมไพเลอร์เรียบง่ายเป็นปัญหาที่แก้ได้ง่ายกว่ามาก รีจิสเตอร์ทั้งหมดที่จัดสรรให้กับตัวแปรฟังก์ชันโลคัลสามารถนำกลับมาใช้ใหม่ได้หลังจากที่ออกจากฟังก์ชันเนื่องจากรู้ว่าตัวแปรนั้นตายแล้ว ตัวแปรทั่วโลกไม่มีการรับประกันที่ง่ายเช่นนั้น ดังนั้นคอมไพเลอร์ที่มีความสามารถน้อยกว่าอาจไม่ปรับอายุการใช้งานของพวกเขาเช่นกันและตัวแปรทั่วโลกจะกินทะเบียนเสมอ สิ่งนี้จะไม่ทำให้ช้าลงแต่ในบางไดรเวอร์อาจ จำกัด ขนาดของ shader ที่คุณสามารถเขียนได้
โดยทั่วไปฉันขอแนะนำให้เก็บตัวแปรทั้งหมดเป็นภาษาท้องถิ่น ให้คำจำกัดความใกล้เคียงกับการใช้ตัวแปรตามความเหมาะสม สิ่งนี้ใช้ได้กับทุกภาษาโปรแกรมไม่ใช่เฉพาะ GLSL ฉันขอแนะนำให้ทำ const "ตัวแปร" ทุกครั้งในทุกกรณีที่คุณสามารถทำได้ อาจเป็นคำแนะนำสำหรับคอมไพเลอร์ที่มีความสามารถน้อยกว่าซึ่งการปรับให้เหมาะสมบางอย่างเป็นไปได้และที่สำคัญกว่านั้นคือทำให้รหัสของคุณจัดทำเอกสารด้วยตนเองได้ดีขึ้นและง่ายต่อการบำรุงรักษา
และแน่นอนนี่คือหน้าที่ของคุณ "เพียงแค่โปรไฟล์เพื่อทดสอบและหาคำแนะนำอย่างแน่นอน" เขียน shader ของคุณด้วยและไม่ต้องกลมกลืนและโพรไฟล์ของคุณ คำแนะนำในการปฏิบัติงานใด ๆ และทั้งหมดออนไลน์ควรได้รับความเชื่อถือและสันนิษฐานว่าอาจได้รับการคาดการณ์ล่วงหน้าหรือล้าสมัย
main()
ฟังก์ชั่นหรือไม่ คุณค่าของคุณคือตัวแปรทั่วโลก(ชุดเครื่องแบบหรือแอตทริบิวต์ใน GLSL parlance) หรือค่าคงที่หรือไม่?