Apa pro dan kontra dari HLSL vs GLSL vs cg? [Tutup]

61

Apa pro / kontra dari ketiganya?

Z_guy
sumber
2
Sepertinya Anda pertama-tama harus memutuskan API apa yang Anda tuju (OGL atau DX) dan platform apa sebelum Anda memutuskan bahasa shader apa.
Tetrad
1
Saya pikir pertanyaan ini brilian. Bagaimana dengan wiki komunitas? Saya baru mengenal semua ini dan pertanyaan tentang perbedaan pada shader adalah apa yang perlu saya ketahui.
Mladen Mihajlovic
3
Koreksi: "ditutup sebagai tidak konstruktif" harus mengatakan "ditutup sebagai melanggar kebijakan dimwit", karena ini IS konstruktif.
Lennart Rolland

Jawaban:

42

coderanger benar tentang penargetan HLSL DirectX, penargetan GLSL OpenGL dan CG tersedia dengan kedua antarmuka.

Namun ada hal lain yang perlu dipertimbangkan (pelajari di forum OGRE):

  • CG tidak akan mengizinkan Anda menggunakan fitur GLSL terbaru (saya tidak yakin tentang HLSL). Ini adalah jalan tengah sehingga Anda tidak akan dapat sepenuhnya mengeksploitasi fitur GLSL, hanya yang umum sampai Shader Model 3.0 (dipahami AFAI).
  • CG dibuat oleh NVidia yang mengoptimalkannya untuk kartu itu tetapi tampaknya tidak banyak bekerja untuk kartu ATI ... beberapa orang melaporkan bahwa mungkin ada masalah dengan kartu ATI menggunakan CG.
  • OpenGL tampaknya sedikit lebih lambat daripada DirectX pada platform Windows. Itu benar-benar relatif terhadap apa yang Anda lakukan dan alasan untuk ini menemukan sumbernya di implementasi driver tetapi ada baiknya untuk mengetahui sebelum Anda memilih API dan bahasa shader terkait. Namun, OpenGL adalah satu-satunya antarmuka yang tersedia pada semua platform (win / mac / unix / some console). Jadi mengetahui itu, menggunakan secara eksklusif GLSL mungkin menjadi pilihan yang lebih baik untuk game non-Microsft-centric-cross-platform.
  • Driver NVidia di Linux tampaknya lebih stabil daripada driver ATI, membuat CG lebih menarik jika Anda perlu memastikan itu bekerja dengan baik di linux (itu semua informasi yang dilaporkan, Anda harus memeriksa detailnya)

Jadi, jika Anda tidak menggunakan fitur shader terbaru, CG sepertinya pilihan yang bagus. GLSL tampaknya lebih baik jika Anda menggunakan OpenGL penuh. HLSL jika Anda menggunakan platform Microsoft secara eksklusif.

Sekarang pertama-tama mengembangkan HLSL untuk windows untuk menggunakan DirectX dan kemudian mengkonversi ke GLSL untuk linux dan mac bisa menjadi solusi yang lebih baik untuk memastikan kinerja dan memiliki set fitur shader yang lebih besar tersedia. Namun itu mungkin banyak pekerjaan (tidak melakukannya sendiri jadi saya tidak tahu). Mesin grafis OGRE (dan mesin lainnya) memungkinkan untuk menggunakan API apa pun (DirectX atau OpenGL atau lainnya) sehingga sangat membantu, tetapi masih ada kode shader untuk dikonversi jika Anda menggunakan cara ini.

Itu semua informasi yang saya kumpulkan ketika memilih bahasa shader saya (saya belum membuat keputusan).


Pembaruan: Valve melakukan konversi salah satu game mereka ke OpenGL dan tidak menemukan cara untuk membuat versi DirectX lebih cepat daripada yang OGL . Jadi perlu diingat bahwa keadaan implementasi driver, kualitas API, dll., Semua itu berubah terlalu banyak setiap tahun sehingga Anda benar-benar mengandalkan kinerja mentah sebagai argumen untuk memilih satu atau yang lain. Dengan mengingat hal ini, pilih OpenGL / GLSL untuk menyederhanakan hidup Anda saat bekerja (atau memiliki rencana atau harapan untuk bekerja) dengan platform lain selain Windows, gunakan DirectX / HLSL jika Anda benar-benar ingin menggunakan hanya platform Microsoft dan fokus dan mungkin ada beberapa yang bagus API lebih cepat dari OpenGL (ini sedang membalikkan sekarang, jadi jangan mengandalkan itu); gunakan CG jika Anda ingin memberikan kedua kemungkinan kepada pengguna, tetapi jika Anda memiliki tenaga kerja (dan peralatan) untuk melakukannya, menggunakan GLSL dan HLSL mungkin merupakan solusi yang layak juga.


Pembaruan (2012): Penting untuk dicatat bahwa CG telah dihentikan, dan tidak lagi didukung atau dikerjakan secara aktif oleh Nvidia. Nvidia merekomendasikan bahwa semua pengguna beralih ke kombinasi GLSL dan HLSL, atau pustaka yang lebih baru seperti nvFX (on github). Ini karena terlalu sulit untuk mempertahankan kompatibilitas fitur antara GLSL dan HLSL.

Klaim
sumber
2
Ya . NVIDIA tampaknya tidak peduli dengan masalah dengan kartu ATI.
bobobobo
4
"OpenGL tampaknya sedikit lebih lambat daripada DirectX pada platform Windows." Dalam kebanyakan kasus biasanya karena dukungan vendor untuk driver dengan OpenGL tidak sebagus pada Windows seperti halnya dengan DirectX.
ChrisC
1
Catatan: Saya memilih OpenGL / GLSL pada akhirnya karena perbaikan terbaru dan kebutuhan untuk memastikan permainan saya bekerja pada beberapa tablet non-MS.
Klaim
2
@Komunitas: Apakah Anda memiliki tautan untuk menghentikan dukungan untuk Cg?
Nicol Bolas
15

Saya hanya dapat berbicara tentang CG vs HLSL karena mereka adalah 2 yang saya gunakan sejauh ini.

Cg tidak sama dengan HLSL.

Di Cg, NVIDIA melakukan pekerjaan yang sangat baik dalam menciptakan sintaks shader yang sangat bersih. Sangat mirip dengan HLSL.

Tetapi , mengikat bersama dengan D3D9 / D3D11 (kode init, kode kompilasi shader) jauh lebih bersih pada HLSL daripada Cg. -1 Cg. Cg memiliki sedikit kode start up yang tidak perlu Anda miliki untuk HLSL daripada D3D.

Di Cg, Anda harus "cgGetNamedParameter" untuk setiap uniform variabel shader yang ingin Anda atur / modifikasi. Dan Anda harus mempertahankan CGparameterreferensi dalam kode Anda untuk variabel itu

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

Dalam HLSL, ini akhirnya menjadi jauh lebih bersih - hanya satu baris, dan Anda tidak harus mempertahankan CGparametervariabel itu.

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

Di atas, DX_CHECKhanyalah fungsi sederhana yang memeriksa HRESULT yang akan dikembalikan dari SetMatrixpanggilan. Kode di atas adalah d3d9 . D3D10 dan 11, tentu saja, jauh lebih menyakitkan (karena tidak ada objek ID3DX11Effect).

Sebelum saya mulai menggunakan HLSL, saya dulu melihat kode ini dan benar-benar merasa iri .

Meskipun NVIDIA melakukan yang terbaik untuk membuat antarmuka umum untuk Cg antara OpenGL / D3D, praktis berbicara yang tidak seperti itu, dan Anda memiliki cgGL*, cgD3D9, cgD3D10,cgD3D11 kelompok fungsi untuk bersaing dengan. Jadi seluruh itu berfungsi untuk OpenGL dan D3D !! Klaim hanya sejauh ini. Anda masih harus membungkus semuanya menjadi #ifdefgrup tipe OpenGL / D3D untuk membuatnya bekerja pada platform yang berbeda. -2 Cg.

Selanjutnya saya baru-baru ini memiliki pengalaman buruk dengan kartu Cg / ATI, yang saya yakin bukan yang buruk. (Orang lain mencobanya?). Saya pikir mungkin benar bahwa NVIDIA tidak sepenuhnya menguji kartu ATI, seperti klaim Klaim. Atau ATI tidak menguji Cg. Dengan satu atau lain cara, ada ketidaksesuaian di sana dan semacam konflik kepentingan. -3 Cg.

Secara keseluruhan saya lebih suka Cg. Its kode shader sintaks dan penamaan bersih, manis, dan rapi. Sayang sekali ada masalah lainnya.

bobobobo
sumber
10

Pemahaman saya yang sangat mendasar adalah bahwa HLSL hanya untuk DirectX dan GLSL hanya untuk OpenGL. Cg pada dasarnya adalah bahasa yang sama dengan HLSL, tetapi dapat digunakan dengan DirectX atau OpenGL (meskipun melalui kode runtime yang berbeda).

pembuat kode
sumber
+1 Itulah pemahaman saya juga, secara pribadi saya suka menggunakan cg kapan pun saya bisa, tetapi itu menambahkan ketergantungan ekstra di luar sistem render itu sendiri; dan saya sepertinya ingat memiliki beberapa masalah aneh dengan driver OpenGL, cg dan ATI dengan beberapa efek yang lebih kompleks ...
Riley Adams
Saya menggunakan Ogre dan dengan demikian memiliki ketiganya tersedia untuk saya, tetapi jika saya ingin memiliki DirectX dan OpenGL saya harus menulis shader di HLSL dan GLSL atau hanya cg? Apakah itu benar?
Z_guy
14
-1. Ini adalah jawaban yang sangat sederhana dan orang akan berharap untuk menemukan informasi yang lebih luas di situs ini.
bobobobo
2
-1: Saya setuju dengan bobobobo.
Nicol Bolas
1
Sayangnya saya harus -1 untuk alasan yang sama seperti bobobobo.
Jonathan Dickinson
8

Perbedaan penting lainnya antara HLSL dan GLSL (saya tidak tahu CG jadi saya tidak bisa berbicara untuk itu) adalah bahwa dengan HLSL Microsoft menyediakan compiler shader sebagai bagian dari runtime D3D sedangkan dengan GLSL vendor perangkat keras Anda menyediakannya sebagai bagian dari mereka sopir.

Ini memiliki kelebihan dan kekurangan di kedua sisi.

Dengan metode GLSL, vendor dapat menyetel kompiler ke kapabilitas perangkat keras mereka. Mereka tahu perangkat keras mereka sendiri, mereka tahu apa yang harus dilakukan dan apa yang tidak boleh dilakukan. Di sisi lain kerugiannya adalah bahwa - di dunia di mana ada banyak vendor perangkat keras - Anda memiliki situasi di mana mungkin ada ketidakkonsistenan antara penyusun shader, dan vendor tersebut juga memiliki pemerintahan bebas untuk mengacaukannya.

Dengan metode HLSL Microsoft mengontrol kompiler. Setiap orang pada basis teknologi yang konsisten, dan jika shader mengkompilasi dengan sukses di satu tempat maka dapat dianggap layak untuk dikompilasi di mana-mana. Shader yang sama akan menghasilkan output yang dikompilasi sama terlepas dari vendor (semua hal lain sama saja). Di sisi lain, kompiler HLSL harus menjadi sesuatu yang "bekerja secara konsisten pada segalanya", jadi ia tidak dapat menarik trik khusus vendor khusus untuk mengeluarkan beberapa tetes jus terakhir dari tangki.

Jika ini muncul seolah-olah saya memiliki preferensi untuk pandangan dunia HLSL itu karena saya lakukan. Saya telah digigit dengan buruk sebelumnya oleh perilaku sangat tidak konsisten pada platform yang berbeda, dan dalam satu kasus bahkan akhirnya harus memutar kembali beban GLSL ke ARB ASM hanya untuk mendapatkan garis dasar yang berfungsi. Kompiler GLSL NVIDIA dapat dilihat sebagai sangat terkenal di sini - ia bahkan akan menerima sintaks dan kata kunci HLSL, yang berarti bahwa jika Anda tidak berhati-hati Anda akhirnya dapat menghasilkan shader yang hanya akan bekerja pada NVIDIA dan tidak ada yang lain. Itu adalah hutan di luar sana.

Maximus Minimus
sumber
1
Agar adil, compiler NVIDIA's GLSL telah menjadi lebih ketat tentang apa yang ia terima dan tidak terima sejak saat itu. Tetapi bahkan hari ini, ada apa yang saya sebut "perangkap NVIDIA" yang membuatnya mudah untuk melakukan sesuatu yang Anda pikir harus bekerja, tetapi tidak sesuai dengan spesifikasi dan driver AMD yang sebenarnya.
Nicol Bolas
Saya bahkan melangkah lebih jauh dengan mengatakan bahwa pengembangan ATI / AMD, atau paling tidak pengecekan silang dengan ATI / AMD secara teratur, masih merupakan keharusan mutlak. Anda mendapatkan dua kill untuk harga satu di sana karena Anda juga akan menangkap bug pada driver OpenGL mereka juga.
Maximus Minimus
Saat menargetkan Vulkan, atau implementasi OpenGL yang mendukung SPIR-V, shader GLSL dapat dipra-kompilasi ke SPIR-V.
Andrea
@ Andrea - ya, itu benar; jelas Vulkan maupun SPIR-V tidak ada pada saat pertanyaan diajukan (dan asnwer ditulis).
Maximus Minimus
1

Saya telah menggunakan keduanya, saya mulai dengan glsl dan pindah ke hlsl hanya karena proyek menuntutnya. Diberi pilihan, itu glsl sepanjang jalan. glsl terasa sangat apik dan hlsl terasa seperti keluar dari bangku hobi seorang insinyur.

pengguna24721
sumber
1

Anda mungkin ingin melihat ke RTSS (Run Time Shader System) yang dilengkapi dengan Ogre juga. Ini cukup baru, tetapi pada dasarnya Anda menulis shader dalam kode daripada file eksternal. Saya belum mengimplementasikannya, tapi pasti berencana untuk menggunakan ini ketika saatnya tiba.

Berikut ini adalah serangkaian besar tutorial tentang wiki Ogre juga untuk menulis shader. http://www.ogre3d.org/tikiwiki/JaJDoo+Shader+Guide

Adapun pertanyaan awal Anda, seperti kata Praetor, itu bukan masalah pro / kontra, itu adalah masalah sistem rendering apa yang ingin Anda gunakan. Karena menggunakan DX / OpenGL dengan Ogre hanya masalah memuat plugin, Anda kemungkinan besar ingin menggunakan format .cg.

Aidan Knight
sumber