openGL一些概念01

2021-09-07 10:29:58 字數 4694 閱讀 9604

頂點資料:

頂點資料是一系列頂點的集合。

乙個頂點(vertex)是乙個3d座標的資料的集合。

而頂點資料是用頂點屬性(vertex attribute)表示的,它可以包含任何我們想用的資料

(但是簡單起見,我們還是假定每個頂點只有乙個3d位置和一些顏色值組成的。)

圖元:為了讓opengl知道我們的座標和顏色值構成的到底是什麼,opengl需要你去指定這些資料所表示的渲染型別。

我們是希望把這些資料渲染成一系列的點?一系列的三角形?還是僅僅是乙個長長的線?做出這些提示的叫做圖元(primitive)

任何乙個繪製指令的呼叫都將把圖元傳遞給opengl。這是其中的幾個:

gl_points 、gl_********s、 gl_line_strip。

圖形渲染管線的第乙個部分是頂點著色器(vertex shader),它把乙個單獨的頂點作為輸入。

頂點著色器主要的目的是把3d座標轉換為另一種3d座標,同時頂點著色器允許我們對頂點屬性進行一些基本處理。

圖元裝配(primitive assembly)階段將頂點著色器輸出的所有頂點作為輸入(如果是gl_points,那麼就是乙個頂點),

並所有的點裝配成指定圖元的形狀;

圖元裝配階段的輸出會傳遞給幾何著色器(geometry shader)。幾何著色器把圖元形式的一系列頂點的集合作為輸入,

它可以通過產生新頂點構造出新的(或是其他的)圖元來生成其他形狀。

幾何著色器的輸出會被傳入光柵化階段(rasterization stage),這裡它會把圖元對映為最終螢幕上相應的畫素,

生成供片段著色器(fragment shader)使用的片段(fragment) 。在片段著色器執行之前會執行裁切(clipping),

裁切會丟棄超出你的檢視以外的所有畫素,用來提公升執行效率。

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

片段著色器的主要目的是計算乙個畫素的最終顏色,這也是所有opengl高階效果產生的地方。

通常片段著色器包含3d場景的資料(比如光照、陰影、光的顏色等等),這些資料可以被用來計算最終畫素的顏色。

在所有對應顏色值確定以後,最終的物件將會被傳到最後乙個階段,我們叫做alpha測試和混合(blending)階段

這個階段檢測片段的對應的深度(和模版(stencil))值,用它們來判斷這個畫素是其他物體的前面還是後面,

決定是否應該丟棄。這個階段也會檢查alpha值 並對物體進行混合(blend)。

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

在現代opengl中,我們必須定義至少乙個頂點著色器和乙個片段著色器(因為gpu中沒有預設的頂點/片段著色器)。

渲染乙個2d的三角形,我們將它頂點的z座標設定為0.0,這樣子的話三角形每一點的深度(depth) 都是一樣的,從而使它看上去像是2d的。

通常深度可以理解為z座標,它代表乙個畫素在空間中和你的距離,如果離你遠就可能被別的畫素遮擋,你就看不到它了,它會被丟棄,以節省資源。

標準化裝置座標(normalized device coordinates,ndc)

一旦你的頂點座標已經在頂點著色器中處理過,它們就應該是標準化裝置座標了,

標準化座標是乙個x、y和z值在-1.0到1.0的一小段空間。

標準化裝置座標接著會變換為螢幕空間座標(screen-space coordinates),這是使用你通過glviewport 函式提供的資料,進行視口變換(viewport transform)完成的。

所得的螢幕空間座標又會被變換為片段輸入到片段著色器中。

定義這樣的頂點資料以後,我們會把它輸入傳送給圖形渲染管線的第乙個處理階段:頂點著色器。

它會在gpu上建立記憶體用於儲存我們的頂點資料,還要配置opengl如何解釋這些記憶體,並且指定其如何傳送給顯示卡。

我們通過頂點緩衝物件(vertex buffer objects,vbo)管理這個記憶體。

頂點緩衝物件是我們在opengl中第乙個出現的opengl物件。

這個緩衝有乙個獨一無二的id,所以我們可以使用glgenbuffers 函式和乙個緩衝id生成乙個vbo物件:

gluint vbo;

glgenbuffers(

1, &vbo);

opengl有很多緩衝物件型別,頂點緩衝物件的緩衝型別是gl_array_buffer。opengl允許我們同時繫結多個緩衝,

只要它們的是不同的緩衝型別。我們可以使用glbindbuffer 函式把新建立的緩衝繫結到gl_array_buffer目標上:

glbindbuffer(gl_array_buffer,vbo);

從這一刻起,我們使用的任何(在gl_array_buffer目標上的)緩衝呼叫都會用來配置當前繫結的緩衝(vbo)。

然後我們可以呼叫glbufferdata函式,它會把之前定義的頂點資料複製到緩衝的記憶體中:

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

glbufferdata是乙個專門用來把使用者定義的資料複製到當前繫結緩衝的函式。

1個引數是目標緩衝的型別;

2個引數是指定傳輸資料大小(以位元組為單位);

3個引數是我們希望傳送的實際資料;

4個引數指定了我們希望顯示卡如何管理給定的資料。它有3種形式:

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

gl_dynamic_draw:資料會被改變很多。

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

向量(vector)它簡明的表達了任意空間中的位置和方向,並且它有非常有用的數學屬性。

在glsl中乙個向量有最多4個分量,每個分量都代表空間中的乙個座標,它們可以通過vec.x、vec.y、vec.z和vec.w來獲取。

vec.w分量而是用在所謂透視劃分(perspective division)上。

在真實的程式裡輸入資料通常都不是標準化裝置座標,頂點著色器一般會先把它們轉換至opengl的可視區域內。

頂點著色器(vertexshader)

const glchar* vertexshadersource = "

#version 330 core \

layout(location = 0) in vec3 position; \

void main() \\"

;

編譯著色器

編寫之後的頂點著色器原始碼,為了能讓opengl使用它,我們必須在執行時動態編譯它的原始碼。

首先建立乙個著色器物件,注意還是用id來引用的。所以我們儲存這個頂點著色器為gluint,

然後用glcreateshader 建立這個著色器:

gluint vertexshader;

vertexshader = glcreateshader(gl_vertex_shader);

我們把需要建立的著色器型別以引數形式提供給glcreateshader。

由於我們正建立乙個頂點著色器,傳遞的引數是gl_vertex_shader。

glshadersource(vertexshader,1,&vertexshadersource,null);

glcompileshader(vertexshader);

glshadersource函式引數:

1個引數要編譯的著色器物件;

2個引數指定傳遞的原始碼字串數量,上面這裡只有乙個;

3個引數是頂點著色器真正的原始碼;

4個引數我們先設定為null。

如果想檢測glcompileshader是否成功可以用glgetshaderiv 檢查是否編譯成功。如果失敗可以用glgetshaderinfolog獲取錯誤資訊。

片段著色器(fragment shader)

該著色器全是關於計算你的畫素最後的顏色輸出。

const glchar* fragmentshadersource = "

#version 330 core \

out vec4 color; \

void main() \\"

;

在計算機圖形中顏色被表示為有4個元素的陣列:紅色、綠色、藍色和alpha(透明度)分量,通常縮寫為rgba。

每個分量的強度設定在0.0到1.0之間。

編譯片段著色器的過程與頂點著色器類似,只不過我們使用gl_fragment_shader常量作為著色器型別:

gluint fragmentshader;

fragmentshader = glcreateshader(gl_fragment_shader);

glshadersource(fragmentshader,1,&fragmentshadersource,null);

glcompileshader(fragmentshader);

兩個著色器現在都編譯了,剩下的事情是把兩個著色器物件鏈結到乙個用來渲染的著色器程式(shader program)中。

openGL一些概念02

著色器程式 著色器程式物件 shader program object 是多個著色器合併之後並最終鏈結完成的版本。如果要使用剛才編譯的著色器我們必須把他們鏈結為乙個著色器程式物件,然後在渲染物件的時候啟用這個著色器程式。已啟用著色器程式的著色器將在我們傳送渲染呼叫的時候被使用。當鏈結著色器至乙個程式...

OpenGL的一些基礎概念

一 什麼是opengl opengl是乙個圖形api,包含了一系列的可以操作圖形 影象的函式。它並不是乙個獨立的平台,需要使用乙個程式語言來工作,最常見的就是使用c 然而,更嚴格的定義來講,opengl應該是指一套規範。二 opengl的一些基礎概念 1 核心模式與立即渲染模式 早期的opengl使...

tensorflow 一些概念01

1 平方差 a b a b a b 2 均方差 方差3 交叉熵 均方差 交叉熵 方差 4 5 6 資料 方差是各個資料與平均數之差的平方的和的平均數,公式為 s 1 n x x x x x x 其中,x表示樣本的平均數,n表示樣本的數量,xi表示個體,而s 2就表示方差。平方差 a b a b a ...