ค่าใช้จ่ายในการผูกเฉดสีอาจไม่สำคัญ แต่จะไม่เป็นปัญหาคอขวดของคุณเว้นแต่ว่าคุณจะแสดงสิ่งของหลายพันรายการโดยไม่ต้องแบทช์วัตถุทั้งหมดที่ใช้เฉดสีเดียวกัน
แม้ว่าฉันไม่แน่ใจว่าสิ่งนี้ใช้ได้กับอุปกรณ์มือถือหรือไม่ แต่ GPU ไม่ช้าอย่างน่ากลัวกับกิ่งไม้หากเงื่อนไขอยู่ระหว่างค่าคงที่และสม่ำเสมอ ทั้งสองถูกต้องทั้งคู่ถูกนำมาใช้ในอดีตและจะยังคงใช้ในอนาคตเลือกสิ่งที่คุณคิดว่าจะสะอาดกว่าในกรณีของคุณ
นอกจากนี้ยังมีวิธีอื่นอีกสองสามวิธีในการทำสิ่งนี้: "Uber-shaders" และกลอุบายเล็กน้อยกับวิธีที่โปรแกรม OpenGL เชื่อมโยง
"Uber-shaders" เป็นตัวเลือกแรกโดยไม่หักสาขา แต่คุณมีหลายเฉดสี แทนการใช้if
งบที่คุณใช้พรีโพรเซสเซอร์ - #define
, #ifdef
, #else
, #endif
, และเรียบเรียงรุ่นต่าง ๆ รวมทั้งที่เหมาะสม#define
สำหรับสิ่งที่คุณต้องการ
vec4 color;
#ifdef PER_VERTEX_COLOR
color = in_color;
#else
color = obj_color;
#endif
นอกจากนี้คุณยังสามารถแบ่ง shader ขึ้นเป็นฟังก์ชั่นแยก มีหนึ่ง shader ที่กำหนดต้นแบบสำหรับฟังก์ชั่นทั้งหมดและเรียกพวกเขาเชื่อมโยงกลุ่มของเฉดพิเศษที่รวมถึงการใช้งานที่เหมาะสม ฉันใช้เคล็ดลับนี้สำหรับการทำแผนที่เงาเพื่อให้ง่ายต่อการสลับวิธีการกรองในวัตถุทั้งหมดโดยไม่ต้องปรับเปลี่ยนเฉดสีทั้งหมด
//ins, outs, uniforms
float getShadowCoefficient();
void main()
{
//shading stuff goes here
gl_FragColor = color * getShadowCoefficient();
}
จากนั้นฉันสามารถมีไฟล์ shader อื่น ๆ หลายไฟล์ที่กำหนดgetShadowCoefficient()
เครื่องแบบที่จำเป็นและไม่มีอะไรอื่น ตัวอย่างเช่นshadow_none.glsl
ประกอบด้วย:
float getShadowCoefficient()
{
return 1;
}
และshadow_simple.glsl
มี (เรียบง่ายจาก shader ของฉันที่ใช้ CSM):
in vec4 eye_position;
uniform sampler2DShadow shad_tex;
uniform mat4 shad_mat;
float getShadowCoefficient()
{
vec4 shad_coord = shad_mat * eye_position;
return texture(shad_tex, shad_coord).x;
}
และคุณสามารถเลือกได้ว่าต้องการแรเงาหรือไม่โดยการเชื่อมโยงshadow_*
shader อื่น วิธีการแก้ปัญหานี้อาจมีค่าใช้จ่ายมากขึ้น แต่ฉันต้องการคิดว่าคอมไพเลอร์ GLSL นั้นดีพอที่จะเพิ่มประสิทธิภาพค่าใช้จ่ายเพิ่มเติมใด ๆ เมื่อเทียบกับวิธีการทำเช่นนี้ ฉันไม่ได้ทำการทดสอบใด ๆ เกี่ยวกับเรื่องนี้ แต่มันเป็นวิธีที่ฉันชอบทำ