ข้อดี / ข้อเสียของทั้งสามคืออะไร?
ข้อดี / ข้อเสียของทั้งสามคืออะไร?
คำตอบ:
coderanger นั้นถูกต้องเกี่ยวกับ HLSL ที่กำหนดเป้าหมาย DirectX, GLSL ที่กำหนดเป้าหมาย OpenGL และ CG ซึ่งสามารถใช้ได้กับทั้งสองอินเตอร์เฟส
อย่างไรก็ตามมีสิ่งอื่นที่ต้องพิจารณา (เรียนรู้บนฟอรัม OGRE):
ดังนั้นหากคุณไม่ได้ใช้คุณสมบัติ shader ล่าสุด CG ก็เป็นตัวเลือกที่ดี GLSL ดูเหมือนจะดีกว่าถ้าคุณใช้ OpenGL แบบเต็ม HLSL ถ้าคุณไปบนแพลตฟอร์ม Microsoft โดยเฉพาะ
ตอนนี้การพัฒนาครั้งแรกใน HLSL สำหรับ windows เพื่อใช้ DirectX จากนั้นแปลงเป็น GLSL สำหรับ linux และ mac อาจเป็นทางออกที่ดีกว่าเพื่อให้แน่ใจถึงประสิทธิภาพและมีชุดคุณลักษณะ shader ที่ใหญ่กว่า อย่างไรก็ตามมันอาจเป็นงานจำนวนมาก (ไม่ได้ทำด้วยตัวเองดังนั้นฉันจึงไม่สามารถบอกได้) เอ็นจิ้น OGRE กราฟิก (และเอ็นจิ้นอื่น ๆ ) อนุญาตให้ใช้ API ใด ๆ (DirectX หรือ OpenGL หรืออื่น ๆ ) ดังนั้นจึงช่วยได้ แต่ยังคงมีรหัส shader ที่จะแปลงหากคุณใช้วิธีนี้
นั่นคือข้อมูลทั้งหมดที่ฉันรวบรวมในขณะที่เลือกภาษาของฉัน (ฉันยังไม่ได้ตัดสินใจ)
ปรับปรุง: วาล์วทำแปลงของหนึ่งในเกมของพวกเขาที่จะ OpenGL และพบว่าวิธีที่จะทำให้รุ่น DirectX เร็วกว่า OGL หนึ่งไม่มี ดังนั้นโปรดจำไว้ว่าสถานะการใช้งานไดรเวอร์คุณภาพ API ฯลฯ ทั้งหมดนั้นเปลี่ยนแปลงไปมากเกินไปในแต่ละปีเพื่อให้คุณใช้ประสิทธิภาพแบบดิบเป็นข้อโต้แย้งในการเลือกข้อใดข้อหนึ่ง เมื่อคำนึงถึงสิ่งนี้ให้เลือก OpenGL / GLSL เพื่อทำให้ชีวิตของคุณง่ายขึ้นเมื่อทำงาน (หรือมีแผนหรือหวังว่าจะทำงาน) กับแพลตฟอร์มอื่นที่ไม่ใช่ Windows ใช้ DirectX / HLSL ถ้าคุณต้องการใช้เฉพาะแพลตฟอร์ม Microsoft และมุ่งเน้นและอาจมีประโยชน์ API เร็วกว่า OpenGL (นี่เป็นการย้อนกลับทันทีดังนั้นอย่านับรวมไว้) ใช้ CG หากคุณต้องการให้ทั้งผู้ใช้มีความเป็นไปได้ แต่ถ้าคุณมีกำลังงาน (และเครื่องมือ) ที่จะทำมันการใช้ทั้ง GLSL และ HLSL อาจเป็นวิธีแก้ปัญหาได้เช่นกัน
Update (2012): เป็นเรื่องสำคัญที่จะต้องทราบว่า CG ถูกยกเลิกแล้วและไม่ได้รับการสนับสนุนหรือทำงานอย่างแข็งขันโดย Nvidia อีกต่อไป Nvidia แนะนำให้ผู้ใช้ทุกคนสลับไปใช้การรวมกันของ GLSL และ HLSL หรือไลบรารีที่ใหม่กว่าเช่น nvFX (บน github) นี่เป็นเพราะมันยากเกินไปที่จะรักษาความเข้ากันได้ของคุณสมบัติระหว่าง GLSL และ HLSL
ฉันสามารถพูดคุยเกี่ยวกับ CG vs HLSL เพราะพวกเขาเป็น 2 ฉันได้ใช้จนถึง
Cg ไม่เหมือนกับ HLSL
ใน Cg NVIDIA ทำผลงานได้ยอดเยี่ยมในการสร้างไวยากรณ์ shader ที่สะอาดมาก มันคล้ายกับ HLSL มาก
แต่การเชื่อมโยงกับ D3D9 / D3D11 (รหัส init, รหัสการรวบรวม shader) นั้นสะอาดกว่า HLSL มากกว่า Cg -1 Cg Cg มีโค้ดเริ่มต้นที่น่ารังเกียจที่คุณไม่จำเป็นต้องมีสำหรับ HLSL บน D3D
ใน Cg คุณต้อง "cgGetNamedParameter" สำหรับตัวแปร shader ทุก uniform
ตัวที่คุณต้องการตั้งค่า / แก้ไข และคุณต้องรักษาCGparameter
อ้างอิงในรหัสของคุณสำหรับตัวแปรนั้น
// C++ code to interact with Cg shader variable (shader language independent)
CGparameter mvp = cgGetNamedParameter( vs, "modelViewProj" );
CG::getLastError("Getting modelViewProj parameter"); // check for errors
cgSetMatrixParameterdr( mvp, &modelViewProj._11 ) ; // setting the matrix values
ใน HLSL สิ่งนี้กลายเป็นเรื่องที่สะอาดกว่าเดิม - เพียงแค่หนึ่งบรรทัดและคุณไม่จำเป็นต้องบำรุงรักษาCGparameter
ตัวแปรนั้น
// D3D9 C++ code to interact with HLSL shader variable
DX_CHECK( id3dxEffect->SetMatrix("modelViewProj", &mvp._11 ), "Set matrix" ) ;
ในข้างต้นDX_CHECK
เป็นเพียงฟังก์ชั่นง่ายๆที่ตรวจสอบ HRESULT ที่ได้รับคืนจากการSetMatrix
โทร รหัสข้างต้นเป็น d3d9 แน่นอนว่า D3D10 และ 11 นั้นมีความเจ็บปวดมากกว่า (เนื่องจากไม่มีวัตถุ ID3DX11Effect)
ก่อนที่ฉันจะเริ่มใช้ HLSL ฉันเคยดูที่รหัสนี้และอิจฉาจริงๆ
แม้ว่า NVIDIA ไม่ได้ดีที่สุดของพวกเขาที่จะทำให้การติดต่อกันสำหรับ Cg ระหว่าง OpenGL / D3D, จวนพูดมันไม่ได้เป็นอย่างนั้นและคุณได้cgGL*
, cgD3D9
, cgD3D10
,cgD3D11
กลุ่มฟังก์ชั่นการโต้แย้งกับ ทั้งหมดนั้นใช้ได้กับ OpenGL และ D3D !! การเรียกร้องเท่านั้นจนถึงตอนนี้ คุณยังต้องรวมทุกอย่างไว้ใน#ifdef
กลุ่มประเภทOpenGL / D3D เพื่อให้มันทำงานบนแพลตฟอร์มที่แตกต่างกัน -2 Cg
ต่อไปฉันเพิ่งมีประสบการณ์ที่ไม่ดีกับการ์ด Cg / ATI ซึ่งฉันค่อนข้างมั่นใจว่าไม่เลว (มีคนอื่นลองดูไหม) ฉันคิดว่าอาจเป็นจริงที่ NVIDIA ไม่ทดสอบการ์ด ATI อย่างสมบูรณ์ตามที่ Klaim อ้าง หรือ ATI นั้นไม่ได้ทดสอบกับ Cg ไม่ทางใดก็ทางหนึ่งมีความไม่ตรงกันและความขัดแย้งทางผลประโยชน์ -3 Cg
ทั้งหมดในทุกสิ่งที่ฉันต้องการ Cg ใช้รหัส Shaderไวยากรณ์และการตั้งชื่อคือสะอาดหวานและเป็นระเบียบเรียบร้อย เลวร้ายเกินไปมันมีปัญหาอื่น ๆ เหล่านี้
ความเข้าใจพื้นฐานของฉันคือ HLSL สำหรับ DirectX และ GLSL สำหรับ OpenGL เท่านั้น Cg นั้นเป็นภาษาเดียวกับ HLSL แต่สามารถใช้กับ DirectX หรือ OpenGL (แม้ว่าจะใช้รหัสรันไทม์ที่แตกต่างกัน)
ข้อแตกต่างที่สำคัญอีกอย่างหนึ่งระหว่าง HLSL และ GLSL (ฉันไม่รู้ CG ดังนั้นฉันไม่สามารถพูดได้) คือด้วย HLSL Microsoft ให้ shader คอมไพเลอร์เป็นส่วนหนึ่งของ D3D runtime ในขณะที่ GLSL ผู้จำหน่ายฮาร์ดแวร์ของคุณให้เป็นส่วนหนึ่งของพวกเขา คนขับรถ
นี้มีข้อดีและข้อเสียทั้งสองด้าน
ด้วยวิธีการ GLSL ผู้ขายสามารถปรับแต่งคอมไพเลอร์ให้เป็นความสามารถของฮาร์ดแวร์ของพวกเขา พวกเขารู้ว่าฮาร์ดแวร์ของตัวเองดีที่สุดพวกเขารู้ว่าต้องทำอะไรและไม่ควรทำอะไร ในทางกลับกันข้อเสียคือ - ในโลกที่มีผู้จำหน่ายฮาร์ดแวร์หลายราย - คุณมีสถานการณ์ทุกที่ที่อาจมีความไม่สอดคล้องกันระหว่างคอมไพเลอร์ Shader และผู้ขายก็มีอิสระในการครอบครองอย่างสมบูรณ์
ด้วยวิธี HLSL Microsoft ควบคุมคอมไพเลอร์ ทุกคนอยู่บนฐานเทคโนโลยีที่สอดคล้องกันและหากผู้รวบรวมรวบรวมประสบความสำเร็จในที่เดียวก็สามารถรวบรวมได้ทุกที่ Shader เดียวกันจะสร้างผลลัพธ์ที่คอมไพล์แล้วโดยไม่คำนึงถึงผู้ขาย (ทุกสิ่งเท่าเทียมกันแน่นอน) ในทางกลับกันคอมไพเลอร์ HLSL จะต้องเป็น "ทำงานอย่างสม่ำเสมอกับทุกสิ่ง" ดังนั้นจึงไม่สามารถดึงลูกเล่นพิเศษเฉพาะของผู้ขายเพื่อให้น้ำหยดไม่กี่หยดสุดท้ายออกจากถัง
ถ้าสิ่งนี้เกิดขึ้นราวกับว่าฉันมีความพึงพอใจต่อมุมมอง HLSL ของโลกนั่นเป็นเพราะฉันทำ ฉันถูกกัดไม่ดีมาก่อนโดยพฤติกรรมที่ไม่สอดคล้องกันอย่างรุนแรงบนแพลตฟอร์มที่แตกต่างกันและในกรณีหนึ่งก็จบลงด้วยการต้องโหลด GLSL กลับไปที่ ARB ASM เพื่อให้ได้พื้นฐานที่ใช้งานได้ คอมไพเลอร์ GLSL ของ NVIDIA สามารถมองเห็นได้โดยเฉพาะอย่างยิ่งที่นี่ - แม้จะยอมรับไวยากรณ์และคำหลักของ HLSL ซึ่งหมายความว่าหากคุณไม่ระวังคุณสามารถลงเอยด้วยการผลิตเฉดเงาที่จะทำงานกับ NVIDIA เท่านั้น มันเป็นป่าที่นั่น
ฉันใช้ทั้งคู่ฉันเริ่มด้วย glsl และย้ายไปที่ hlsl เพียงเพราะโครงการต้องการ ให้ทางเลือกมัน glsl ตลอดทาง glsl รู้สึกลื่นมากและ hlsl รู้สึกเหมือนมันออกมาจากโต๊ะทำงานอดิเรกของวิศวกร
คุณอาจต้องการดู RTSS (Run Time Shader System) ที่มาพร้อมกับ Ogre เช่นกัน มันค่อนข้างใหม่ แต่โดยทั่วไปคุณเขียนเฉดในโค้ดแทนที่จะเป็นไฟล์ภายนอก ฉันยังไม่ได้ใช้งาน แต่ยังวางแผนที่จะใช้สิ่งนี้เมื่อถึงเวลา
นี่คือชุดบทเรียนขนาดใหญ่เกี่ยวกับ Ogre wiki เช่นกันสำหรับการเขียนเฉดสี http://www.ogre3d.org/tikiwiki/JaJDoo+Shader+Guide
สำหรับคำถามดั้งเดิมของคุณเช่น Praetor กล่าวว่าไม่ใช่เรื่องของข้อดี / ข้อเสียมันเป็นเรื่องของระบบการแสดงผลที่คุณต้องการใช้ เนื่องจากการใช้ DX / OpenGL กับ Ogre นั้นเป็นเพียงเรื่องของการโหลดปลั๊กอินคุณอาจต้องการใช้รูปแบบ. cg