Những ưu / nhược điểm của ba là gì?
Những ưu / nhược điểm của ba là gì?
Câu trả lời:
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):
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.
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 CGparameter
tham 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ì CGparameter
biến đó .
// D3D9 C++ code to interact with HLSL shader variable
DX_CHECK( id3dxEffect->SetMatrix("modelViewProj", &mvp._11 ), "Set matrix" ) ;
Ở trên, DX_CHECK
chỉ là một chức năng đơn giản để kiểm tra HRESULT được trả về từ SetMatrix
cuộ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 và 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 #ifdef
cá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.
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).
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.
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ư.
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.