OpenGL基礎學習之三渲染知識

2022-04-20 11:43:54 字數 1929 閱讀 7796

一.渲染的基礎物件概念

1.頂點陣列物件(vao vertex array object)

2.頂點緩衝物件(vbo vertex buffer object)

3.索引緩衝物件(ibo index buffer object)

4.圖形渲染管線(graphics pipeline)圖形渲染管線接受一組3d座標,然後把它們轉變為你螢幕上的有色2d畫素輸出

5.著色器(shader 在顯示卡的小處理核心上各自執行的小程式,在圖形渲染管線中快速處理你的資料 opengl使用的著色器語言為glsl (opengl shading language))

二.渲染管線階段

1.頂點資料傳入  

2.頂點著色器 vertex shader:可自定義著色器

頂點著色器主要的目的是把3d座標(標準化裝置座標)轉為另一種3d座標(螢幕空間座標),同時頂點著色器允許我們對頂點屬性進行一些基本處理通過頂點緩衝物件(vbo)管理頂點可以使用glgenbuffers函式和乙個緩衝id生成乙個vbo物件

unsigned int vbo;

glgenbuffers(1, &vbo);

頂點緩衝物件的緩衝型別是gl_array_buffer

可以使用glbindbuffer函式把新建立的緩衝繫結到gl_array_buffer目標上

glbindbuffer(gl_array_buffer, vbo); 

在繫結後,使用任何(在gl_array_buffer目標上的)緩衝呼叫都會用來配置當前繫結的緩衝(vbo)。然後我們可以呼叫glbufferdata函式,它會把之前定義的頂點資料複製到緩衝的記憶體中

glbufferdata(gl_array_buffer, sizeof(vertices), vertices, gl_static_draw);

第乙個引數是目標緩衝的型別:頂點緩衝物件當前繫結到gl_array_buffer目標上。第二個引數指定傳輸資料的大小(以位元組為單位);用乙個簡單的sizeof計算出頂點資料大小就行。第三個引數是我們希望傳送的實際資料。

第四個引數指定了我們希望顯示卡如何管理給定的資料

gl_static_draw :資料不會或幾乎不會改變。

gl_dynamic_draw:資料會被改變很多。

gl_stream_draw :資料每次繪製時都會改變。

3.形狀裝配 shape assembly 

頂點著色器輸出的所有頂點作為輸入(如果是gl_points,那麼就是乙個頂點),並所有的點裝配成指定圖元的形狀

4.幾何著色器 geometry shader:可自定義著色器

可自定義著色器

把圖元形式的一系列頂點的集合作為輸入,它可以通過產生新頂點構造出新的(或是其它的)圖元來生成其他形狀

5.光柵化 rasterization

把圖元對映為最終螢幕上相應的畫素,生成供片段著色器(fragment shader)使用的片段(fragment)。在片段著色器執行之前會執行裁切(clipping)。裁切會丟棄超出你的檢視以外的所有畫素,用來提公升執行效率

乙個片段是opengl渲染乙個畫素所需的所有資料

6.片段著色器 fragment shader:可自定義著色器

計算乙個畫素的最終顏色,這也是所有opengl高階效果產生的地方。通常,片段著色器包含3d場景的資料(比如光照、陰影、光的顏色等等),這些資料可以被用來計算最終畫素的顏色

7.測試與混合 test and blending

檢測片段的對應的深度(和模板(stencil))值,用它們來判斷這個畫素是其它物體的前面還是後面,決定是否應該丟棄。這個階段也會檢查alpha值(alpha值定義了乙個物體的透明度)並對物體進行混合(blend)

對於大多數場合,我們只需要配置頂點和片段著色器就行了。幾何著色器是可選的,通常使用它預設的著色器就行了

三.資料輸入

3.1頂點輸入

只有在標準化裝置座標內的座標才會處理[-1.0,1.0]

OpenGL渲染管線之紋理(三)

概述 紋理時乙個2d 也可以是1d或者3d 用來讓圖形看起來更真實。是一種很簡單就能夠模擬真實的方法,因為如果不使用紋理,那麼我們就必須為所有細節構建頂點和圖形,這樣的開銷會非常大,有了紋理後,我們就只需要少很多的頂點,然後把紋理貼上去就可以了,及時有些不真實,但是也看不出來。紋理座標 紋理座標的原...

python基礎之三

import module name 直接匯入 module name.func 呼叫函式時,需要模組名作為字首 from module name import function name 不用使用模組名作為字首 from module name import 匯入模組下的所有函式和類注 pytho...

Oracle基礎之三

3.select distinct 列名稱 別名 列名稱 別名 列名稱 別名 from 表名稱 別名 where 過濾條件 s order by 字段 asc desc 字段 asc desc 字段 asc desc order by 是在select 後面執行的,所以可以唯一使用別名進行排序。as...