Những ưu và nhược điểm của HLSL so với GLSL so với cg là gì? [đóng cửa]


61

Những ưu / nhược điểm của ba là gì?


2
Có vẻ như trước tiên bạn sẽ cần phải quyết định API nào bạn sẽ sử dụng (OGL hoặc DX) và nền tảng nào trước khi bạn quyết định ngôn ngữ đổ bóng nào.
Tetrad

1
Tôi nghĩ rằng câu hỏi này là tuyệt vời. Làm thế nào về một wiki cộng đồng? Tôi chưa quen với tất cả những điều này và một câu hỏi về sự khác biệt đối với các shader là chính xác những gì tôi cần biết.
Mladen Mihajlovic

3
Sửa chữa: "đóng như không mang tính xây dựng" nên nói "đóng như vi phạm chính sách dimwit", bởi vì điều này mang tính xây dựng.
Lennart Rolland

Câu trả lời:


42

coderanger nói đúng về HLSL nhắm mục tiêu DirectX, GLSL nhắm mục tiêu OpenGL và CG có sẵn với cả hai giao diện.

Tuy nhiên, có những điều khác cần xem xét (học trên diễn đàn OGRE):

  • CG sẽ không cho phép bạn sử dụng các tính năng mới nhất của GLSL (Tôi không chắc chắn về HLSL). Đó là một nền tảng ở giữa nên bạn sẽ không thể khai thác triệt để các tính năng GLSL, chỉ có một tính năng phổ biến cho đến khi Shader Model 3.0 (AFAI hiểu).
  • CG được tạo bởi NVidia để tối ưu hóa nó cho thẻ của nó nhưng dường như không làm được nhiều việc cho thẻ ATI ... một số người báo cáo rằng có thể có vấn đề với thẻ ATI khi sử dụng CG.
  • OpenGL dường như chậm hơn một chút so với DirectX trên nền tảng Windows. Điều đó thực sự liên quan đến những gì bạn đang làm và lý do cho việc này tìm thấy nó trong nguồn triển khai trình điều khiển nhưng thật tốt khi biết trước khi bạn chọn API và ngôn ngữ đổ bóng liên quan. Tuy nhiên, OpenGL là giao diện duy nhất có sẵn trên tất cả các nền tảng (win / mac / unix / some console). Vì vậy, biết rằng, sử dụng GLSL độc quyền có thể là sự lựa chọn tốt hơn cho một trò chơi đa nền tảng không phải là microsft.
  • Trình điều khiển NVidia trên Linux dường như ổn định hơn trình điều khiển ATI, làm cho CG trở nên thú vị hơn nếu bạn cần chắc chắn rằng nó hoạt động tốt trên linux (đó là tất cả các thông tin được báo cáo, bạn sẽ phải kiểm tra chi tiết)

Vì vậy, nếu bạn không sử dụng các tính năng đổ bóng mới nhất, CG có vẻ là một lựa chọn tốt. GLSL có vẻ như là một điểm trừ nếu bạn sử dụng OpenGL đầy đủ. HLSL nếu bạn đang độc quyền trên nền tảng của Microsoft.

Bây giờ đầu tiên phát triển trong HLSL cho các cửa sổ để sử dụng DirectX và sau đó chuyển đổi sang GLSL cho linux và mac có thể là giải pháp tốt hơn để đảm bảo hiệu suất và có sẵn các tính năng đổ bóng lớn hơn. Tuy nhiên, nó có thể là rất nhiều công việc (tôi đã không tự làm nên tôi không thể nói). Công cụ đồ họa OGRE (và các công cụ khác) cho phép sử dụng bất kỳ API nào (DirectX hoặc OpenGL hoặc các công cụ khác) để giúp, nhưng vẫn có mã shader để chuyển đổi nếu bạn đi theo cách này.

Đó là tất cả thông tin tôi thu thập được trong khi chọn ngôn ngữ đổ bóng của mình (Tôi chưa đưa ra quyết định của mình).


Cập nhật: Valve đã thực hiện chuyển đổi một trong những trò chơi của họ sang OpenGL và không tìm thấy cách nào để làm cho phiên bản DirectX nhanh hơn phiên bản OGL . Vì vậy, hãy nhớ rằng trạng thái triển khai trình điều khiển, chất lượng API, v.v., tất cả những điều đó thay đổi quá nhiều mỗi năm để bạn hoàn toàn dựa vào hiệu suất thô làm đối số để chọn cái này hay cái khác. Với suy nghĩ này, hãy chọn OpenGL / GLSL để đơn giản hóa cuộc sống của bạn khi làm việc (hoặc có kế hoạch hoặc hy vọng hoạt động) với các nền tảng khác ngoài Windows, sử dụng DirectX / HLSL nếu bạn thực sự chỉ muốn sử dụng các nền tảng của Microsoft và tập trung và có thể có một số điều tốt API nhanh hơn OpenGL (hiện tại nó đang đảo ngược, vì vậy đừng tin vào nó); sử dụng CG nếu bạn muốn cung cấp cả hai khả năng cho người dùng, nhưng nếu bạn có lực lượng lao động (và công cụ) để làm điều đó, sử dụng cả GLSL và HLSL cũng có thể là một giải pháp khả thi.


Cập nhật (2012): Điều quan trọng cần lưu ý là CG đã bị ngừng và không còn được Nvidia hỗ trợ hoặc tích cực làm việc nữa. Nvidia khuyên tất cả người dùng nên chuyển sang kết hợp GLSL và HLSL hoặc thư viện mới hơn như nvFX (trên github). Điều này là do quá khó để duy trì khả năng tương thích tính năng giữa GLSL và HLSL.


2
. NVIDIA dường như không quan tâm đến các vấn đề với thẻ ATI.
bobobobo

4
"OpenGL dường như chậm hơn một chút so với DirectX trên nền tảng Windows." Trong hầu hết các trường hợp, điều này thường do nhà cung cấp hỗ trợ cho trình điều khiển với OpenGL không tốt trên Windows như với DirectX.
ChrisC

1
Lưu ý: Cuối cùng tôi đã chọn OpenGL / GLSL vì những cải tiến gần đây và cần đảm bảo trò chơi của tôi hoạt động trên một số máy tính bảng không phải MS.
Klaim

2
@ Cộng đồng: Bạn có bất kỳ liên kết nào cho việc ngừng hỗ trợ cho Cg không?
Nicol Bolas


15

Tôi chỉ có thể nói về CG vs HLSL vì đó là 2 cái tôi đã sử dụng cho đến nay.

Cg không giống như HLSL.

Trong Cg, NVIDIA đã làm một công việc tuyệt vời trong việc tạo ra một cú pháp đổ bóng rất sạch. Nó rất giống với HLSL.

Nhưng , liên kết với D3D9 / D3D11 (mã init, mã biên dịch shader) sạch hơn nhiều trên HLSL so với Cg. -1 Cg. Cg có một chút mã khởi động khó chịu mà bạn thậm chí không cần phải có đối với HLSL trên D3D.

Trong Cg, bạn phải "cgGetNamedParameter" cho mọi uniform biến shader bạn muốn đặt / sửa đổi. Và bạn phải duy trì một CGparametertham chiếu trong mã của mình cho biến đó

// 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

Trong HLSL, điều này cuối cùng sẽ sạch hơn nhiều - chỉ một dòng và bạn không phải duy trì CGparameterbiến đó .

// D3D9 C++ code to interact with HLSL shader variable
DX_CHECK( id3dxEffect->SetMatrix("modelViewProj", &mvp._11 ), "Set matrix" ) ;

Ở trên, DX_CHECKchỉ là một chức năng đơn giản để kiểm tra HRESULT được trả về từ SetMatrixcuộc gọi. Mã trên là d3d9 . D3D10 và 11, tất nhiên, đau đớn hơn nhiều (vì không có đối tượng ID3DX11Effect).

Trước khi tôi bắt đầu sử dụng HLSL, tôi đã từng xem mã này và thực sự ghen tị .

Mặc dù NVIDIA đã làm hết sức mình để thực hiện một giao diện chung cho Cg giữa OpenGL / D3D, thực tế nói của nó không theo cách đó, và bạn có cgGL*, cgD3D9, cgD3D10,cgD3D11 nhóm chức năng để đấu tranh với. Vì vậy, toàn bộ hoạt động cho OpenGL D3D !! Yêu cầu chỉ đi cho đến nay. Bạn vẫn phải kết hợp mọi thứ thành #ifdefcác nhóm loại OpenGL / D3D để làm cho nó hoạt động trên các nền tảng khác nhau. -2 Cg.

Hơn nữa gần đây tôi đã có một trải nghiệm tồi tệ với thẻ Cg / ATI, điều mà tôi khá chắc chắn không phải là xấu của tôi. (Một số người khác thử nó?). Tôi nghĩ có thể đúng là NVIDIA không hoàn toàn kiểm tra thẻ ATI, như tuyên bố của Klaim. Hoặc ATI không kiểm tra trên Cg. Bằng cách này hay cách khác, có một sự không phù hợp ở đó và một số xung đột lợi ích. -3 Cg.

Tất cả trong tất cả tôi thích Cg. Nó đang đổ bóng cú pháp và đặt tên là sạch, ngọt, và ngăn nắp. Nó quá tệ, nó có những vấn đề khác.


10

Hiểu biết rất cơ bản của tôi là HLSL chỉ dành cho DirectX và GLSL chỉ dành cho OpenGL. Cg về cơ bản là cùng ngôn ngữ với HLSL, nhưng có thể được sử dụng với DirectX hoặc OpenGL (mặc dù thông qua mã thời gian chạy khác nhau).


+1 Đó là sự hiểu biết của tôi, cá nhân tôi thích sử dụng cg bất cứ khi nào tôi có thể, nhưng nó có thêm một sự phụ thuộc ngoài hệ thống kết xuất; và tôi dường như nhớ lại có một số vấn đề lạ với trình điều khiển OpenGL, cg và ATI với một số hiệu ứng phức tạp hơn ...
Riley Adams

Tôi đang sử dụng Ogre và do đó có sẵn cả ba thứ cho tôi, nhưng nếu tôi muốn có cả DirectX và OpenGL, tôi phải viết các shader trong cả HLSL và GLSL hoặc chỉ cg? Có đúng không?
Z_guy

14
-1. Đây là một câu trả lời cực kỳ thô sơ và người ta hy vọng sẽ tìm thấy nhiều thông tin hơn trên trang web này.
bobobobo

2
-1: Tôi đồng ý với bobobobo.
Nicol Bolas

1
Thật không may, tôi phải -1 vì những lý do tương tự như bobobobo.
Jonathan Dickinson

8

Một điểm khác biệt quan trọng khác giữa HLSL và GLSL (Tôi không biết CG nên tôi không thể nói về điều đó) là với HLSL, Microsoft cung cấp trình biên dịch shader như một phần của thời gian chạy D3D trong khi với GLSL, nhà cung cấp phần cứng của bạn cung cấp nó như một phần của họ người lái xe.

Điều này có lợi thế và bất lợi từ cả hai phía.

Với phương pháp GLSL, nhà cung cấp có thể điều chỉnh trình biên dịch theo khả năng của phần cứng của họ. Họ biết phần cứng của mình tốt nhất, họ biết phải làm gì và không nên làm gì. Mặt khác, nhược điểm là - trong một thế giới có nhiều nhà cung cấp phần cứng - bạn có một tình huống có thể có sự không nhất quán giữa các trình biên dịch shader và nhà cung cấp cũng hoàn toàn trị vì miễn phí.

Với phương thức HLSL, Microsoft điều khiển trình biên dịch. Mọi người đều ở trên một nền tảng công nghệ nhất quán, và nếu một shader biên dịch thành công ở một nơi thì có thể hợp lý để biên dịch ở mọi nơi. Cùng một shader sẽ tạo ra cùng một đầu ra được biên dịch bất kể nhà cung cấp (tất cả những thứ khác đều bằng nhau). Mặt khác, trình biên dịch HLSL phải là một thứ "hoạt động ổn định trên mọi thứ", do đó, nó không thể rút bất kỳ thủ thuật đặc biệt nào của nhà cung cấp để lấy vài giọt nước ép cuối cùng ra khỏi bể.

Nếu điều này xuất hiện như thể tôi có một ưu tiên cho chế độ xem HLSL về thế giới thì đó là vì tôi làm. Trước đây, tôi đã bị cắn rất tệ bởi hành vi không nhất quán trên các nền tảng khác nhau và trong một trường hợp thậm chí cuối cùng phải đưa một tải GLSL trở lại ARB ASM chỉ để có được đường cơ sở hoạt động. Trình biên dịch GLSL của NVIDIA có thể được xem là đặc biệt nổi tiếng ở đây - thậm chí nó sẽ chấp nhận cú pháp và từ khóa HLSL, nghĩa là nếu không cẩn thận, bạn có thể sẽ tạo ra các shader chỉ hoạt động trên NVIDIA và không có gì khác. Đó là một khu rừng rậm ngoài kia.


1
Công bằng mà nói, trình biên dịch GLSL của NVIDIA đã trở nên khắt khe hơn về những gì nó làm và không chấp nhận kể từ những ngày đó. Nhưng ngay cả ngày nay, có những gì tôi gọi là "bẫy NVIDIA" giúp bạn dễ dàng thực hiện một việc mà bạn nghĩ nên làm, nhưng không theo thông số kỹ thuật thực tế và trình điều khiển AMD.
Nicol Bolas

Tôi thậm chí còn đi xa hơn khi nói rằng phát triển trên ATI / AMD, hoặc ít nhất là kiểm tra chéo với ATI / AMD một cách thường xuyên, vẫn là một điều tuyệt đối phải làm. Bạn nhận được hai lần giết với giá của nó ở đó vì bạn cũng sẽ gặp lỗi trong trình điều khiển OpenGL của họ.
Maximus Minimus

Khi nhắm mục tiêu Vulkan hoặc triển khai OpenGL hỗ trợ SPIR-V, các trình tạo bóng GLSL có thể được biên dịch trước thành SPIR-V.
Andrea

@Andrea - vâng, điều đó đúng; rõ ràng cả Vulkan và SPIR-V đều không tồn tại vào thời điểm câu hỏi được đặt ra (và asnwer đã được viết).
Maximus Minimus

1

Tôi đã sử dụng cả hai, tôi bắt đầu với glsl và chuyển sang hlsl chỉ vì dự án yêu cầu nó. Đưa ra lựa chọn, đó là tất cả các cách. glsl cảm thấy rất trơn tru và hlsl cảm thấy như nó bước ra từ băng ghế dự bị của kỹ sư.


1

Bạn có thể muốn xem xét RTSS (Run Time Shader System) đi kèm với Ogre. Nó là khá mới, nhưng về cơ bản, bạn viết shader trong mã chứ không phải các tệp bên ngoài. Tôi chưa thực hiện nó, nhưng chắc chắn có kế hoạch sử dụng nó khi thời gian đến.

Dưới đây là một loạt các hướng dẫn khổng lồ trên wiki Ogre cũng như để viết shader. http://www.ogre3d.org/tikiwiki/JaJDoo+Shader+Guide

Đối với câu hỏi ban đầu của bạn, như Praetor đã nói, đây không thực sự là vấn đề ưu / nhược điểm, đó là vấn đề về hệ thống kết xuất nào bạn muốn sử dụng. Vì việc sử dụng DX / OpenGL với Ogre chỉ là vấn đề tải plugin, nên rất có thể bạn sẽ muốn sử dụng định dạng .cg.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.