2011-12-29 50 views
0

我在這裏有三個問題:GLSL和c有什麼區別?

  1. Qt/3D API是由GLSL代碼實現的嗎?
  2. GLSL代碼是否作爲正常的c/C++代碼編譯和鏈接,並且可以在CPU(不是GPU)上運行?
  3. 爲什麼GLSL比正常的c/C++更好地渲染?

回答

11

您似乎對GLSL有什麼根本性的誤解。它不是圖形的編程語言。它是一個着色器語言。

OpenGL rendering pipeline中,渲染對象的某些階段被設計爲由程序實現。這些階段被稱爲「着色器階段」。着色器是一個程序,用GLSL編寫(至少用於OpenGL),在這些着色器階段之一執行。

GLSL被用作渲染過程的一部分。 GLSL定義了如何渲染,而不是什麼被渲染。

因此:

是通過GLSL代碼實現了Qt/3D API?

不符合你的意思。繪圖功能的一些渲染流水線可能是。但它可能不會。這與你無關,因爲你從外面使用它。

GLSL代碼是否作爲正常的c/C++代碼編譯和鏈接,並且可以在CPU(不是GPU)上運行?

不是,根據上面。着色器影響渲染,渲染髮生在GPU上。 GLSL是OpenGL的着色語言,因此GLSL代碼在GPU上執行。

爲什麼GLSL比正常的c/C++更好?

這不是更好或更壞;你不能使用另一個。作爲渲染流水線的一部分,您不能隨意在GPU上丟棄隨機C代碼。而且你不能編譯CPU的GLSL。我們稱之爲domain specific language。這是一種旨在促進特定目的的語言。它具有大多數語言根本沒有的語言結構。它知道什麼是「紋理」。它具有在單次渲染調用(統一)內對着色器的多次執行不變的值的概念。它有許多其他的概念,這些概念對於基於硬件的着色器和渲染問題是獨一無二的。

您不僅可以將C或C++扔在GPU上,您也不會想要。不適用於着色器。

+0

'GLSL代碼是否作爲正常的c/C++代碼編譯和鏈接,並且可以在CPU(不是GPU)上運行?' '着色器影響渲染,渲染髮生在GPU上。 GLSL是OpenGL的着色語言,因此GLSL代碼在GPU上執行。' 嚴格來說,這並非完全正確。如果你在[仿真模式](http://stackoverflow.com/questions/7364871/how-to-start-opengl-in-software-emulation-mode)中運行OpenGL,一切都將在CPU上完成。 – 2012-08-02 23:05:10

+0

@SchighSchagh:OpenGL中沒有「模擬模式」。你會得到最好的是運行MesaGL。 – 2012-08-03 03:48:38

+4

就OpenGL規範而言,沒有提及任何「仿真模式」,但這是因爲它是一個API規範;同樣,該規範沒有提到GPU,當然也沒有要求在GPU上渲染,就像你聲稱的那樣。也就是說,各種驅動程序(包括在您指出的MesaGL中)提供了僅在CPU上運行的純軟件實現。事實上,MesaGL主頁上的** Introduction **明確提到,Mesa可以用於許多不同的環境,從軟件仿真到爲現代GPU完成硬件加速。 – 2012-08-05 02:00:40

4

Qt/3D API是否由GLSL代碼實現?

不是。它可能會在內部使用,但這對用戶來說都是隱藏的。 API本身是C++。 OpenGL的API使用C語言,儘管它(驅動程序)在內部使用程序集。

是否GLSL代碼編譯和鏈接是正常的C/C++代碼

不,當然不是。它由視頻卡驅動程序編譯並在GPU上運行。這是一種相當有限的語言,除了着色器之外沒有太多用處。

爲什麼GLSL在繪畫上比普通的c/C++更有價值?

它包含GPU擅長的功能,同時缺乏功能不佳的功能。