ข้อดีและข้อเสียของ HLSL กับ GLSL เทียบกับ CG คืออะไร [ปิด]


61

ข้อดี / ข้อเสียของทั้งสามคืออะไร?


2
ดูเหมือนว่าคุณต้องตัดสินใจก่อนว่าคุณต้องการใช้ API แบบใด (OGL หรือ DX) และแพลตฟอร์มใดก่อนที่คุณจะตัดสินใจว่าจะใช้ภาษาใด
Tetrad

1
ฉันคิดว่าคำถามนี้ยอดเยี่ยม วิกิชุมชนเป็นอย่างไร? ฉันยังใหม่กับทุกสิ่งนี้และคำถามของความแตกต่างในการ shaders เป็นสิ่งที่ฉันต้องรู้
Mladen Mihajlovic

3
การแก้ไข: "ปิดเป็นไม่สร้างสรรค์" ควรพูดว่า "ปิดเนื่องจากละเมิดนโยบายสลัว" เพราะนี่เป็นสิ่งที่สร้างสรรค์
Lennart Rolland

คำตอบ:


42

coderanger นั้นถูกต้องเกี่ยวกับ HLSL ที่กำหนดเป้าหมาย DirectX, GLSL ที่กำหนดเป้าหมาย OpenGL และ CG ซึ่งสามารถใช้ได้กับทั้งสองอินเตอร์เฟส

อย่างไรก็ตามมีสิ่งอื่นที่ต้องพิจารณา (เรียนรู้บนฟอรัม OGRE):

  • CG จะไม่อนุญาตให้คุณใช้คุณสมบัติล่าสุดของ GLSL (ฉันไม่แน่ใจเกี่ยวกับ HLSL) มันเป็นพื้นกลางดังนั้นคุณจะไม่สามารถใช้ประโยชน์จากคุณสมบัติของ GLSL ได้อย่างเต็มที่จะเป็นเพียงคุณสมบัติทั่วไปจนกว่า Shader Model 3.0 (AFAI จะเข้าใจ)
  • CG ทำโดย NVidia ที่ปรับให้เหมาะสมสำหรับการ์ด แต่ดูเหมือนจะไม่ทำงานมากสำหรับการ์ด ATI ... บางคนรายงานว่าอาจมีปัญหากับการ์ด ATI ที่ใช้ CG
  • OpenGL ดูเหมือนจะช้ากว่า DirectX บนแพลตฟอร์ม Windows เล็กน้อย มันเกี่ยวข้องกับสิ่งที่คุณกำลังทำอยู่และสาเหตุของการค้นพบนี้คือแหล่งที่มาของการใช้งานไดรเวอร์ แต่ก็ควรรู้ก่อนที่คุณจะเลือก API และภาษาที่เกี่ยวข้อง อย่างไรก็ตาม OpenGL เป็นอินเทอร์เฟซเดียวเท่านั้นที่มีอยู่บนแพลตฟอร์มทั้งหมด (win / mac / unix / some consoles) ดังนั้นการรู้ว่าการใช้ GLSL เฉพาะอาจเป็นตัวเลือกที่ดีกว่าสำหรับเกมที่ไม่ใช่ Microsft-centric-cross-platform
  • ไดรเวอร์ NVidia บน Linux ดูเหมือนจะมีเสถียรภาพมากกว่าไดรเวอร์ ATI ทำให้ CG น่าสนใจยิ่งขึ้นถ้าคุณต้องแน่ใจว่ามันทำงานได้ดีบน linux (นั่นคือข้อมูลที่รายงานทั้งหมดคุณจะต้องตรวจสอบรายละเอียด)

ดังนั้นหากคุณไม่ได้ใช้คุณสมบัติ 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


2
ใช่แล้ว NVIDIA ดูเหมือนจะไม่สนใจปัญหาเกี่ยวกับการ์ด ATI
bobobobo

4
"OpenGL ดูเหมือนจะช้ากว่า DirectX บนแพลตฟอร์ม Windows เล็กน้อย" ในกรณีส่วนใหญ่มักจะเกิดจากการสนับสนุนผู้ขายสำหรับไดรเวอร์ที่ใช้ OpenGL นั้นไม่ดีใน Windows เหมือนกับ DirectX
ChrisC

1
หมายเหตุ: ฉันเลือก OpenGL / GLSL ในที่สุดเนื่องจากการปรับปรุงล่าสุดและความต้องการเพื่อให้แน่ใจว่าเกมของฉันทำงานบนแท็บเล็ตที่ไม่ใช่ MS
Klaim

2
@ ชุมชน: คุณมีลิงค์ใด ๆ สำหรับการหยุดให้การสนับสนุน Cg หรือไม่
Nicol Bolas


15

ฉันสามารถพูดคุยเกี่ยวกับ 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ไวยากรณ์และการตั้งชื่อคือสะอาดหวานและเป็นระเบียบเรียบร้อย เลวร้ายเกินไปมันมีปัญหาอื่น ๆ เหล่านี้


10

ความเข้าใจพื้นฐานของฉันคือ HLSL สำหรับ DirectX และ GLSL สำหรับ OpenGL เท่านั้น Cg นั้นเป็นภาษาเดียวกับ HLSL แต่สามารถใช้กับ DirectX หรือ OpenGL (แม้ว่าจะใช้รหัสรันไทม์ที่แตกต่างกัน)


+1 นั่นคือความเข้าใจของฉันเช่นกันโดยส่วนตัวแล้วฉันชอบใช้ cg ทุกครั้งที่ทำได้ แต่เพิ่มการพึ่งพาเกินกว่าระบบเรนเดอร์เอง และฉันดูเหมือนจะจำมีปัญหาบางอย่างแปลกกับ OpenGL, CG และไดรเวอร์ ATI ที่มีผลกระทบที่ซับซ้อนมากขึ้นบางอย่าง ...
ไรลีย์อดัมส์

ฉันใช้ Ogre และมีสามอย่างให้ฉัน แต่ถ้าฉันต้องการทั้ง DirectX และ OpenGL ฉันต้องเขียน shaders ทั้ง HLSL และ GLSL หรือแค่ cg? นั่นถูกต้องใช่ไหม?
Z_guy

14
-1 นี่คือคำตอบที่หยาบคายเป็นอย่างยิ่งและเราหวังว่าจะได้รับข้อมูลที่ครอบคลุมเพิ่มเติมเกี่ยวกับเว็บไซต์นี้
bobobobo

2
-1: ฉันเห็นด้วยกับ bobobobo
Nicol Bolas

1
น่าเสียดายที่ฉันต้อง -1 ด้วยเหตุผลเดียวกับ bobobobo
Jonathan Dickinson

8

ข้อแตกต่างที่สำคัญอีกอย่างหนึ่งระหว่าง HLSL และ GLSL (ฉันไม่รู้ CG ดังนั้นฉันไม่สามารถพูดได้) คือด้วย HLSL Microsoft ให้ shader คอมไพเลอร์เป็นส่วนหนึ่งของ D3D runtime ในขณะที่ GLSL ผู้จำหน่ายฮาร์ดแวร์ของคุณให้เป็นส่วนหนึ่งของพวกเขา คนขับรถ

นี้มีข้อดีและข้อเสียทั้งสองด้าน

ด้วยวิธีการ GLSL ผู้ขายสามารถปรับแต่งคอมไพเลอร์ให้เป็นความสามารถของฮาร์ดแวร์ของพวกเขา พวกเขารู้ว่าฮาร์ดแวร์ของตัวเองดีที่สุดพวกเขารู้ว่าต้องทำอะไรและไม่ควรทำอะไร ในทางกลับกันข้อเสียคือ - ในโลกที่มีผู้จำหน่ายฮาร์ดแวร์หลายราย - คุณมีสถานการณ์ทุกที่ที่อาจมีความไม่สอดคล้องกันระหว่างคอมไพเลอร์ Shader และผู้ขายก็มีอิสระในการครอบครองอย่างสมบูรณ์

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

ถ้าสิ่งนี้เกิดขึ้นราวกับว่าฉันมีความพึงพอใจต่อมุมมอง HLSL ของโลกนั่นเป็นเพราะฉันทำ ฉันถูกกัดไม่ดีมาก่อนโดยพฤติกรรมที่ไม่สอดคล้องกันอย่างรุนแรงบนแพลตฟอร์มที่แตกต่างกันและในกรณีหนึ่งก็จบลงด้วยการต้องโหลด GLSL กลับไปที่ ARB ASM เพื่อให้ได้พื้นฐานที่ใช้งานได้ คอมไพเลอร์ GLSL ของ NVIDIA สามารถมองเห็นได้โดยเฉพาะอย่างยิ่งที่นี่ - แม้จะยอมรับไวยากรณ์และคำหลักของ HLSL ซึ่งหมายความว่าหากคุณไม่ระวังคุณสามารถลงเอยด้วยการผลิตเฉดเงาที่จะทำงานกับ NVIDIA เท่านั้น มันเป็นป่าที่นั่น


1
เพื่อความเป็นธรรมคอมไพเลอร์ GLSL ของ NVIDIA ค่อนข้างเข้มงวดกับสิ่งที่ทำและไม่ยอมรับตั้งแต่สมัยนั้น แต่แม้กระทั่งทุกวันนี้มีสิ่งที่ฉันเรียกว่า "กับดัก NVIDIA" ซึ่งทำให้ง่ายต่อการทำสิ่งที่คุณคิดว่าควรจะทำงาน แต่ไม่เป็นไปตามข้อมูลจำเพาะจริงและไดรเวอร์ AMD
Nicol Bolas

ฉันยังกล่าวต่อไปอีกว่าการพัฒนา ATI / AMD หรืออย่างน้อยที่สุดก็ข้ามการตรวจสอบกับ ATI / AMD เป็นประจำก็ยังคงเป็นสิ่งที่จำเป็นอย่างยิ่ง คุณจะได้รับการสังหารสองครั้งในราคาหนึ่งที่นั่นเพราะคุณจะได้พบข้อบกพร่องในไดรเวอร์ OpenGL ของพวกเขาเช่นกัน
Maximus Minimus

เมื่อกำหนดเป้าหมาย Vulkan หรือการใช้งาน OpenGL ที่สนับสนุน SPIR-V, GLSL shaders สามารถรวบรวมไว้ล่วงหน้าเพื่อ SPIR-V
Andrea

@ Andrea - ใช่ถูกต้อง; เห็นได้ชัดว่าไม่มี Vulkan หรือ SPIR-V ในเวลาที่มีการถามคำถาม (และเขียนเป็น asnwer)
Maximus Minimus

1

ฉันใช้ทั้งคู่ฉันเริ่มด้วย glsl และย้ายไปที่ hlsl เพียงเพราะโครงการต้องการ ให้ทางเลือกมัน glsl ตลอดทาง glsl รู้สึกลื่นมากและ hlsl รู้สึกเหมือนมันออกมาจากโต๊ะทำงานอดิเรกของวิศวกร


1

คุณอาจต้องการดู RTSS (Run Time Shader System) ที่มาพร้อมกับ Ogre เช่นกัน มันค่อนข้างใหม่ แต่โดยทั่วไปคุณเขียนเฉดในโค้ดแทนที่จะเป็นไฟล์ภายนอก ฉันยังไม่ได้ใช้งาน แต่ยังวางแผนที่จะใช้สิ่งนี้เมื่อถึงเวลา

นี่คือชุดบทเรียนขนาดใหญ่เกี่ยวกับ Ogre wiki เช่นกันสำหรับการเขียนเฉดสี http://www.ogre3d.org/tikiwiki/JaJDoo+Shader+Guide

สำหรับคำถามดั้งเดิมของคุณเช่น Praetor กล่าวว่าไม่ใช่เรื่องของข้อดี / ข้อเสียมันเป็นเรื่องของระบบการแสดงผลที่คุณต้องการใช้ เนื่องจากการใช้ DX / OpenGL กับ Ogre นั้นเป็นเพียงเรื่องของการโหลดปลั๊กอินคุณอาจต้องการใช้รูปแบบ. cg

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