ฉันพยายามที่จะตัดหัวของฉันรอบระบบวิธีวัสดุเช่นนี้ , นี้จะดำเนินการ ระบบที่มีลักษณะคล้ายกราฟที่ทรงพลังและเป็นมิตรต่อผู้ใช้เหล่านี้ดูเหมือนจะเป็นวิธีที่ใช้กันทั่วไปในการอนุญาตให้โปรแกรมเมอร์และโปรแกรมเมอร์ที่ไม่ใช่โปรแกรมเมอร์สร้างความแตกต่างอย่างรวดเร็ว อย่างไรก็ตามจากประสบการณ์ที่ จำกัด ของฉันกับการเขียนโปรแกรมกราฟิกฉันไม่แน่ใจว่าพวกเขาทำงานอย่างไร
พื้นหลัง:
ดังนั้นเมื่อฉันได้ตั้งโปรแกรมระบบการแสดงผล OpenGL อย่างง่ายมาก่อนฉันมักจะสร้างคลาสวัสดุที่โหลดรวบรวมและเชื่อมโยง shaders จากไฟล์ GLSL แบบคงที่ที่ฉันสร้างขึ้นด้วยตนเอง ฉันมักจะสร้างคลาสนี้เป็น wrapper ง่าย ๆ สำหรับการเข้าถึงตัวแปรชุด GLSL เป็นตัวอย่างง่ายๆลองนึกภาพว่าฉันมี Shader Vertex พื้นฐานและ Shader Fragment พื้นฐานพร้อม Texture2D แบบพิเศษสำหรับการส่งผ่านพื้นผิว คลาสวัสดุของฉันเพียงแค่โหลดและรวบรวมสองเฉดสีเหล่านั้นลงในวัสดุและจากจุดนั้นมันจะเปิดเผยอินเทอร์เฟซที่เรียบง่ายสำหรับการอ่าน / เขียนชุด Texture2D ของ shader นั้น
เพื่อให้ระบบนี้มีความยืดหยุ่นเพิ่มขึ้นเล็กน้อยฉันมักจะเขียนด้วยวิธีที่อนุญาตให้ฉันพยายามส่งชุดชื่อ / ประเภทใด ๆ[เช่น: SetUniform_Vec4 ("AmbientColor", colorVec4); ซึ่งจะตั้งค่าเครื่องแบบ AmbientColor เพื่อเวกเตอร์ 4d โดยเฉพาะเรียกว่า "colorVec4" ถ้าชุดที่มีอยู่ในวัสดุ.]
class Material
{
private:
int shaderID;
string vertShaderPath;
string fragSahderPath;
void loadShaderFiles(); //load shaders from files at internal paths.
void buildMaterial(); //link, compile, buffer with OpenGL, etc.
public:
void SetGenericUniform( string uniformName, int param );
void SetGenericUniform( string uniformName, float param );
void SetGenericUniform( string uniformName, vec4 param );
//overrides for various types, etc...
int GetUniform( string uniformName );
float GetUniform( string uniformName );
vec4 GetUniform( string uniformName );
//etc...
//ctor, dtor, etc., omitted for clarity..
}
วิธีนี้ใช้งานได้แต่รู้สึกว่าเป็นระบบที่ไม่ดีเนื่องจากลูกค้าของคลาสวัสดุต้องเข้าถึงชุดเครื่องแบบโดยใช้ศรัทธาเพียงอย่างเดียว - ผู้ใช้จะต้องตระหนักถึงชุดเครื่องแบบที่อยู่ในวัตถุแต่ละชิ้นเพราะพวกเขาถูกบังคับให้ ส่งต่อโดยใช้ชื่อ GLSL มันไม่ใช่เรื่องใหญ่โตมากเมื่อมีเพียง 1-2 คนที่ทำงานกับระบบ แต่ฉันไม่สามารถจินตนาการได้ว่าระบบนี้จะขยายได้เป็นอย่างดีเลยและก่อนที่ฉันจะพยายามเขียนโปรแกรมระบบการแสดงผล OpenGL ครั้งต่อไปฉันต้องการระดับ ขึ้นเล็กน้อย
คำถาม:
นั่นคือที่ฉันจนถึงดังนั้นฉันได้พยายามศึกษาวิธีเครื่องมือแสดงผลอื่น ๆ จัดการระบบวัสดุของพวกเขา
วิธีการที่ใช้โหนดนี้เป็นวิธีที่ยอดเยี่ยมและดูเหมือนว่าเป็นระบบที่ใช้กันทั่วไปมากสำหรับการสร้างระบบวัสดุที่เป็นมิตรกับผู้ใช้ในเครื่องมือและเครื่องมือที่ทันสมัย จากสิ่งที่ฉันสามารถบอกได้ว่าพวกเขาอยู่บนพื้นฐานของโครงสร้างข้อมูลกราฟที่แต่ละโหนดแสดงถึงส่วนของวัสดุของคุณและแต่ละเส้นทางแสดงถึงความสัมพันธ์ระหว่างพวกเขา
จากสิ่งที่ฉันสามารถบอกได้การใช้ระบบประเภทนั้นจะง่ายเหมือนคลาส MaterialNode ที่มีคลาสย่อยหลากหลาย (TextureNode, FloatNode, LerpNode ฯลฯ ) แต่ละคลาสย่อย MaterialNode จะมี MaterialConnections
class MaterialConnection
{
MatNode_Out * fromNode;
MatNode_In * toNode;
}
class LerpNode : MaterialNode
{
MatNode_In x;
MatNode_In y;
MatNode_In alpha;
MatNode_Out result;
}
นั่นเป็นแนวคิดพื้นฐานมากแต่ฉันไม่แน่ใจเล็กน้อยเกี่ยวกับวิธีการบางอย่างของระบบนี้ที่จะทำงาน:
1. )หากคุณดู'การแสดงออกของวัสดุ' (โหนด) ต่างๆที่ Unreal Engine 4 ใช้คุณจะเห็นว่าพวกเขาแต่ละคนมีการเชื่อมต่ออินพุทและเอาท์พุทหลากหลายประเภท โหนดบางโหนดลอย, เอาท์พุทบาง vector2, เอาท์พุทเวกเตอร์ 4 บาง, ฯลฯฉันจะปรับปรุงโหนดและการเชื่อมต่อด้านบนเพื่อให้พวกเขาสามารถรองรับประเภทอินพุตและเอาต์พุตที่หลากหลายได้อย่างไร? การทำคลาสย่อย MatNode_Out กับ MatNode_Out_Float และ MatNode_Out_Vec4 (และอื่น ๆ ) เป็นตัวเลือกที่ชาญฉลาดหรือไม่
2. ) ในที่สุดระบบประเภทนี้เกี่ยวข้องกับ GLSL shaders อย่างไร เมื่อดูอีกครั้งที่ UE4 (และคล้ายกันกับระบบอื่น ๆ ที่เชื่อมโยงด้านบน) ผู้ใช้จะต้องเสียบโหนดวัสดุบางส่วนเข้ากับโหนดขนาดใหญ่ด้วยพารามิเตอร์ต่างๆที่แสดงพารามิเตอร์ shader (สีพื้นฐาน, โลหะ, เงา, เปล่งแสง ฯลฯ ) . ข้อสันนิษฐานเดิมของฉันคือ UE4 มีรหัสแบบยาก 'master shader' ที่มีเครื่องแบบหลายแบบและทุกสิ่งที่ผู้ใช้ทำใน 'เนื้อหา' ของพวกเขาจะถูกส่งผ่านไปยัง 'master shader' เมื่อพวกเขาเสียบโหนดเข้ากับ ' โหนดหลัก '
อย่างไรก็ตามเอกสารของ UE4ระบุว่า:
"แต่ละโหนดมีตัวอย่างรหัส HLSL ที่กำหนดให้ทำงานเฉพาะซึ่งหมายความว่าเมื่อคุณสร้างวัสดุคุณกำลังสร้างรหัส HLSL ผ่านการสร้างสคริปต์ด้วยภาพ"
หากเป็นจริงระบบนี้จะสร้างสคริปต์ shader จริงหรือไม่ มันทำงานยังไงกันแน่?