前言要想繪製乙個物件,需要將該物件的頂點資料傳送給頂點著色器。通常要把頂點資料在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...