引用 Cg(C for Graphic)語言概述

2021-07-09 05:02:27 字數 1737 閱讀 3529

摘抄「gpu programming and cg language primer 1rd edition」 中文名「gpu程式設計與cg語言之陽春白雪下里巴人」

cg(c for graphcis)語言,是nvidia與microsoft合作研發,旨在為開發人員提供一套方便、跨平台(良好的相容性),控制可程式設計圖形硬體的高階語言。cg語言的語法結構與c語言非常類似,使用cg編寫的著色程式預設的檔案字尾是*. cg。

4.1 開始cg之旅

cg語言規範是公開和開放的,並且 nvidia開放了cg編譯器技術的源**,使用無限制的、免費的許可證。

目前還沒有乙個主流的專門為編寫著色程式而開發的ide,很多人都是直接在文字中寫好程式後,然後將檔案字尾改為.cg。在網上有乙個名為nshader (的visual studio2008外掛程式,安裝之後可以支援編寫著色程式。圖 11展示了使用該外掛程式之後的使用效果。

4.2 cg特性

cg同時被opengl與direct3d兩種程式設計api所支援。這一點不但對開發人員而言非常方便,而且也賦予了cg程式良好的跨平台性。乙個正確編寫的cg應用程式可以不做任何修改的同時工作在opengl和direct3d之上。

4.3 cg 編譯

4.3.1 cg編譯原理

計算機只能理解和執行由0、1序列(電壓序列)構成的機器語言,所以組合語言和高階語言程式都需要進行翻譯才能被計算機所理解,擔負這一任務的程式稱為語言處理程式,通常也被稱為編譯程式。例如c或者c++ 編寫的程式,需要首先編譯成可執行檔案(.exe檔案),然後才能在gpu上執行,且一旦編譯後,除非改變程式**,否則不需要重新編譯,這種方式稱為靜態編譯(static coompilation)。靜態編譯最重要的特徵是:一旦編譯為可執行檔案,在可執行檔案執行期間不再需要原始碼資訊。而動態編譯(dynamic compilation)與之相反,編譯程式和原始碼都要參與到程式的執行過程中。

cg語言通常採用動態編譯的方式,即,在宿主程式執行時利用cg執行庫( cg runtime library)動態編譯cg**,使用動態編譯的方式,可以將cg程式當作乙個指令碼,隨時修改隨時執行,節省大量的時間,在ogre圖形引擎中就是採用這樣的方法。在文獻[2]的1.4.2章節中提到cg語言同樣支援靜態編譯方式,即,cg原始碼編譯成彙編**後,這部分目標**被鏈結到宿主程式最後的可執行程式中。使用靜態編譯的好處是只要發布可執行檔案即可,原始碼不會被公開。

cg編譯器首先將cg程式翻譯成可被圖形api(opengl和direct3d)所接受的形式,然後應用程式使用適當的opengl和direct3d 命令將翻譯後的cg程式傳遞給圖形處理器,opengl和direct3d驅動程式最後把它翻譯成圖形處理器所需要的硬體可執行格式。nvidia提供的 cg編譯器為cgc.exe。

cg程式的編譯不但依賴於宿主程式所使用的三維程式設計介面,而且依賴於圖形硬體環境,因為圖形硬體自身的限制,不一定支援某種cg語句,例如,如果你所使用的gpu並不支援迴圈控制指令,那麼在cg程式中編寫的迴圈控制語句將無法通過編譯。被特定的圖形硬體環境或aip所支援的cg語言子集,被稱為cg profiles。需要注意的是: profile分為頂點程式的profile和片段程式的profile,這是因為頂點著色器和片段著色器原本就不是工作在同乙個硬體。

cg profiles是cg語言的重要組成部分,在使用cg語言編寫著色程式時,首先要考慮的一點就是「當前的圖形硬體環境支援那個cg profile」,這直接關係到您所編寫的著色程式是否可以在當前的圖形硬體上執行。

強引用,軟引用,弱引用,虛引用

強引用就是我們通常意義上的引用,類似 object object new object 只要強引用在,就不會被gc。軟引用,這種物件就是拿來jvm拿來防止記憶體溢位的乙個措施,當jvm要進行記憶體洩露的時候就會把這種物件進行 如果記憶體還不夠,才會丟擲outofmemoryerror。softref...

引用 普通引用

引用 引用乙個指標 放在 的右邊 void change myclass p int i j 等價於 int const i j int a int b a 引用定義時必須初始化 此時b就已經建立了對a的引用 引用 的本質上是為了方便程式設計師間接修改變數的程式編寫,不需要使用指標,編譯器在內部已經...

強引用,軟引用,弱引用

強引用 強引用設定為空,物件立馬會被 public class normalreference classm 軟引用 軟引用當引用存在的時候,只有當記憶體不足的時候才去 public class t0 softreference catch exception e system.out.printl...