
計算機圖形學的發(fā)展并不存在標準的編程模型秆撮,開發(fā)商們都僅提供自家的硬件底層接口他宛。個人和組織開發(fā)特定的屏幕顯示內容船侧,然而在高效性和可移值性均存在問題。在最初的群魔亂舞的情況下厅各,使得我們有了更高的需求镜撩,最后圖形引擎的步伐加快同時在計算機世界形成了一套圖形API---OpenGL。
- openGL的從現(xiàn)實物理學队塘,特別現(xiàn)代的光學成像系統(tǒng)角度來進行深度思考袁梗。
- openGL完成了從想象到計算機視圖的過程,之間經過多種變換過程憔古。
光學成像系統(tǒng)
對于同一個世界的物體遮怜,其最終經過成像系統(tǒng)生成具體的圖像特征需要一套完成的成像系統(tǒng)。
- 對象:輪廓鸿市,材質锯梁,顏色等
- 觀察者: 眼睛,照相機等數(shù)字化設備
- 外部條件:光源焰情,天氣情況
圖像的確定依賴觀察者陌凳,因此虛擬的成像系統(tǒng)中必須有對象與觀察者、外部條件的關聯(lián)方法内舟。在成像模型中冯遂,可以進行幾何變換(小孔成像)等,并不是所有的物體最終都能完整的在膠片中成像(進行窗口移動裁剪)谒获,給定投影位置和裁剪窗口大小蛤肌,便能確定可以出現(xiàn)的圖像。
OpenGL的實現(xiàn)
計算機圖形學考慮人造對象的概念批狱,模擬我們的現(xiàn)實生活環(huán)境裸准,人們通過,點赔硫,線炒俱,多邊形來構造對象。其流程大概如下:
首先構想我們需要顯示的對象模型,然后根據宏觀世界中的表現(xiàn)形態(tài)轉換成以我們的眼睛為觀察者的顯示权悟,通過成像系統(tǒng)的投影砸王,根據顯示設備的大小進行一定的裁剪處理,適應不同的計算機不同的窗口顯示峦阁,最終形成我們在計算機設備上的構想對象的縮影谦铃。
而其中經歷的變換過程,OpenGL管線 中對應一套處理過程榔昔,上圖主要是對于移動嵌入設備的流程院喜。
---建模函數(shù)--->模型空間(模型坐標)--建模轉換--->世界空間(世界坐標系)--視見轉換->眼睛空間(眼坐標)---投影變換--->剪彩空間(標準化設備坐標)---視口變換--->屏幕坐標
可能有些?會認為,為何要經過?一個世界坐標凡人。為何不直接對模型坐標進?投影,?成圖像那不也是可以的嗎,為什么需要世界坐標的存在行瑞?
當程序有上百個單獨的對象的時候,你要對這個復雜模型進??次性的建氖叻龋基本是不可能的,你的坐標系怎么取也?無法兼顧到能完美的構建每?個物體,所以你必須為每?件物體進?行單獨建模。那么這樣問題就來了,這么多的對象诵肛。如果不通過?個中間體統(tǒng)一的話,怎么直接進行大量工作的處理屹培。
編程實現(xiàn)GLSL
大家都知道 2.0是從1.0的固定管線引入圖像編程機制,包括頂點著色器怔檩,片元著色器以及GLSL語言褪秀,增加了可編程管線滿足開發(fā)需求和呈現(xiàn)能力和渲染性能(頂點緩沖區(qū)對象減少CPU和顯卡之間的交互VBO。珠洗。溜歪。)可編程的腳本語言GLSL(Shader Language)實現(xiàn)以嵌入式 OpenGL-ES 2.0 ios中的為例:
簡單的頂點著色器和片元著色器腳本(沒有對應使用):
uniform mat4 Projection;
uniform mat4 ModelView;
attribute vec4 Position;
varying vec4 DestinationColor;
attribute vec4 SourceColor;
void main(void)
{
gl_Position = (Projection * (ModelView * Position));
DestinationColor =SourceColor;
}
precision mediump float;
varying vec4 DestinationColor;
void main()
{
gl_FragColor = DestinationColor;
}
顧名思義,頂點著色器和片元著色器處理流程對應上圖许蓖,主要進行頂點變換,顏色輸出蝴猪,GLSL語法很簡單,易上手想要改變世界的可以上手操作了膊爪。
對應OpenGL成像的流程自阱,openGL-ES結構圖詳解:
Vertex Array/Buffer objects:頂點數(shù)據來源,這時渲染管線的頂點輸入米酬,通常使用 Buffer objects效率更好沛豌。
Vertex Shader:頂點著色器通過可編程的方式實現(xiàn)對頂點的操作,如進行坐標空間轉換赃额,計算法線加派,頂點顏色以及紋理坐標;
Primitive Assembly:圖元裝配跳芳,經過著色器處理之后的頂點在圖片裝配階段被裝配為基本圖元芍锦。OpenGL ES支持三種基本圖元:點,線和三角形飞盆,它們是可被 OpenGL ES 渲染的娄琉。接著對裝配好的圖元進行裁剪(clip):保留完全在視錐體中的圖元次乓,丟棄完全不在視錐體中的圖元,對一半在一半不在的圖元進行裁剪孽水;接著再對在視錐體中的圖元進行剔除處理(cull):這個過程可編碼來決定是剔除正面票腰,背面還是全部剔除。
Rasterization:光柵化女气。在光柵化階段杏慰,基本圖元被轉換為二維的片元(fragment),fragment 表示可以被渲染到屏幕上的像素主卫,它包含位置逃默,顏色鹃愤,紋理坐標等信息簇搅,這些值是由圖元的頂點信息進行插值計算得到的。這些片元接著被送到片元著色器中處理软吐。
*光柵化是 頂點著色器到片元著色器的過渡即腳本中的 輸出和輸入瘩将。
Fragment Shader:片元著色器通過可編程的方式實現(xiàn)對片元的操作。在這一階段它接受光柵化處理之后的fragment凹耙,color姿现,深度值,模版值作為輸入肖抱。
Per-Fragment Operation:在這一階段對片元著色器輸出的每一個片元進行一系列測試與處理备典,從而決定最終用于渲染的像素。(像素檢測意述,剪裁測試提佣,模板測試,深度測試荤崇,混合等)
*混合是將片段的顏色和幀緩沖區(qū)中已有的顏色值進行混合拌屏,并將混合所得的新值寫入幀緩沖,其中包含各種混合模式术荤。
Framebuffer:存儲這可以用于渲染到屏幕或紋理中的像素值倚喂,也可以從中讀回像素值,可以進行一些即時操作效果的處理瓣戚。
"程序員三大浪漫 : 操作系統(tǒng) 編譯原理 圖形學"
暫不爭論上述描述端圈,圖像學單獨一門學科,一篇文章不能夠將現(xiàn)實世界到計算機世界圖像處理顯示過程描述完整子库,歡迎大家指正舱权。