主要的學習教程是nvidia出的那個《cg教程,可編程實時權威指南》以及三本《GPU編程精粹》
個人能力有限,只能儘量將自己理解的關鍵點記錄下來,有想認真深入的朋友,建議完整的看一遍以上書籍
學習cg語言的主要目的是爲了學習unity3d中shader的編寫,以及以後可能做opengl,opencv的開發
官方的docment是用c++寫opengl接口的程序,然後調用cg語言的.cg 文件來訪問gpu硬件,我不會寫c++,只好把所有工作都放到unity3d的環境中了,其中有些差異,但不大,主要是unity3d應用程序已經將頂點,法線等信息處理好了,封裝了不少使用的東西在它的UNITY.cgnic文件中
一.gpu的發展歷史
第一代第二代沒有可編程能力,固定管線
第三代支持頂點編程(vertex)
第四代(即現今我們使用的)擁有可編程能力,使得頂點變換和像素操作從cpu轉移到gpu中進行
二.gpu的渲染流程
在GPU渲染流水線的不同階段,需要處理的對象分別是頂點(vertex)、幾何圖元(primitive)、片元(fragment)、像素(pixel)
頂點變換:將3d application中給定的頂點位置等,變換屏幕位置以便光柵器使用
圖元處理:圖元裝配和光柵化,圖元裝配即是將頂點裝配爲幾何圖元,光柵化決定那些像素被圖元覆蓋,然後是插值貼圖和着色
光柵操作:對片段進行操作(fragment)
三.vertex fragment
結構體:個人理解,用於定義輸入輸出結構,並綁定語義詞,結尾有;,忘記輸入;會報錯
struct VertexIn{
position:POSITION;
normal:NORMAL;
textoord:TEXTOORD0;
};
語義詞:全部大寫,書中說是一種粘合劑,把cg程序和圖形流水線的其他部分綁定在一起,指明該變量的硬件資源
POSITION
NORMAL
TEXTOORD0
COLOR
等等。。。。。
profile:cg程序用何種接口編譯你的cg程序,各種profile對應不同的編程接口及不同能力的gpu硬件
opengl:
direct:
四.頂點 片段的流程和一些解釋
變量
uniform修飾詞,表示這是一個由外部程序提供的變量
普通變量的聲明:type name = value;
例:float4 color = float4(1,1,1,1);
支持的類型:float,half,fixed三種浮點數類型的範圍和大小不一樣,分別是32bit,16bit,11bit
紋理(texture)
sampler1D
sampler2D
sampler3D
samplerCUBE
samplerRECT