Apa pro / kontra dari ketiganya?
Apa pro / kontra dari ketiganya?
Jawaban:
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):
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.
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 CGparameter
referensi 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 CGparameter
variabel itu.
// D3D9 C++ code to interact with HLSL shader variable
DX_CHECK( id3dxEffect->SetMatrix("modelViewProj", &mvp._11 ), "Set matrix" ) ;
Di atas, DX_CHECK
hanyalah fungsi sederhana yang memeriksa HRESULT yang akan dikembalikan dari SetMatrix
panggilan. 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 #ifdef
grup 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.
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).
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.
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.
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.