OpenGL繪製簡單模型(回顧)

2021-10-08 23:47:46 字數 2203 閱讀 3552

前言要想繪製乙個物件,需要將該物件的頂點資料傳送給頂點著色器。通常要把頂點資料在c++端放入乙個緩衝區(所謂的vbo),並將該緩衝區和著色器中宣告的頂點屬性相關聯。例如:以繪製乙個三維空間立方體傳遞資料為例。

gluint vao,vbo;

glgenvertexarrays(1

,&vao)

;//管理頂點緩衝物件,必須有

glbindvertexarray

(vao)

;glgenbuffers(1

,&vbo)

;//建立緩衝區物件

glbindbuffers

(gl_array_buffer,vbo)

;//將該緩衝區標記為「活躍」

glbufferdata

(gl_array_buffer,

sizeof

(data)

,data,gl_static_draw)

;//將資料複製到緩衝區

glvertexattribpointer(0

,3,gl_float,gl_false,0,

0);//將該緩衝區和頂點屬性相關聯

glenablevertexattribarray(0

);//啟用該頂點屬性:layout(location) in vec3 vpos;

gldrawarrays

(gl_********s,0,

sizeof

(data));

//繪製物件

呼叫gldrawarrays函式後,資料流入管線,進行後續處理。

物件的頂點資料(座標、顏色等)使用緩衝區傳送到著色器的對應屬性,而使得場景呈現出三維效果所構建的變換矩陣通常從c++/opengl應用程式傳送給著色器的統一變數。

//shader code

uniform mat4 mv_matrix;

//c++/opengl

int mvloc=

glgetuniformlocation

(renderingprogram,

"mv_matrix");

gluniformmatrix4fv

(mvloc,

1,gl_false,

value_ptr

(mvmat)

);

其中,renderingprogram是著色器程式的引用id,mvmat是自定義的模型-檢視矩陣,mvloc是統一變數在著色器程式中的位置。

統一變數類似於乙個常量,在每次頂點著色器呼叫中都保持不變。

事實上,c++/opengl應用程式只給opengl管線傳送了36個頂點座標(包含重複頂點),這些頂點定義了構成立方體的圖元(三角形),經過頂點著色器處理之後,沿著管線流動,在光柵化階段,會對這些頂點屬性進行線性插值,從而生成滿足螢幕輸出的畫素位置。指定以gl_********s進行繪製,則光柵化是逐三角形進行的:首先沿著連線頂點的線進行插值,插值精度和畫素顯示密度相關;其次沿著連線邊緣畫素的水平線插值填充三角形內部空間的畫素。

圖1繪製了乙個基本的立方體,每個畫素點的顏色都是紅色。圖2在頂點著色器中為每個頂點單獨指定了顏色,然後用out變數輸出,因此顏色也在光柵化過程中進行插值,最終在片段著色器中使用in變數接收。

圖3使用迴圈語句輸出了圖2中立方體的多個副本。圖4是使用例項化機制繪製了100000個副本,使用gldrawarrayinstanced函式進行繪製。例項化機制在繪製同一物件的大量相同副本時有顯著的效能提公升。(還別說,有時候「莫名其妙」的效果還挺好看的,對於程式中為什麼那樣設定旋轉的角度還是弄不明白,加油吧~~~)

總之,c++/opengl應用程式將資料儲存到緩衝區中,然後傳送給opengl渲染管線,最終輸出到螢幕上。在這個過程中,將構建好的變換矩陣應用到模型上,從而使得二維螢幕中的物件展現出三維效果。

opengl讀取obj模型並繪製

要完成圖形學課程的大作業,用傳統的手動寫點,線,麵等其他資料的方式太繁瑣,工程量太大,且效果不好。故而使用3dsmax建模,然後匯出obj模型,讀取模型進行繪製即可。要讀取obj模型,首先要知道obj模型的內容,即點,面,法線,紋理座標等。用記事本開啟obj檔案,即可檢視obj的內容。其中 為注釋部...

Python 簡單模型建立思路

這裡的建模 引入包 設定字符集,防止中文亂碼 讀入資料,檢視資料 異常資料處理標準化 對資料進行訓練集 測試集劃分 再次檢視資料 模型物件建立 模型訓練,輸出相關引數 模型輸出儲存 載入模型 值與實際畫圖比較 這裡面的知識點比較細,可以搜到很多案例。第一次學的話,模型的儲存容易實際在操作的時候出錯。...

python 網路程式設計,簡單模型

這個是客戶端 1import socket23 拿 4 client socket.socket 56 撥號,寫伺服器的ip和埠 7 client.connect 127.0.0.1 8080 89 10 client.send b i am client 對別人說話 1112 data clien...