網格化(tessellation)即把凹多邊形,包含洞,島的多邊型,或者自交叉多邊型劃分為簡單凸多邊形的過程.
opengl
為了能快速渲染多邊形,只能直接顯示簡單凸多邊形(多邊形中任意兩點的連線上的所有點仍屬於此多邊形),對凹多邊或者自交叉多邊形渲染結果將不確定。在渲染複雜多邊形時,常常需要將複雜多邊形分解成容易渲染的簡單多邊形,opengl中的使用函式庫中提供網格化的函式以通過多邊型輪廓線生成簡單多邊形,從而渲染複雜多邊形。
opengl
進行網格化有5個步驟: 1.
使用glunewtess函式建立乙個網格化物件glutesselator
2.
呼叫glutesscallback函式註冊網格化期間呼叫的**函式。(每個網格化物件需要註冊多個**函式) 3.
呼叫glutessproperty函式制定網格化的屬性,如環繞規則,生成多邊形是以填充多邊形還是以輪廓的形式繪製,以及合併頂點所需的距離閾值。 4.
指定乙個或多個封閉多邊形輪廓,用於建立分割後的簡單多邊形集合。 5.
可重用網格化物件分割其他物件,在不需要時用gludeletetess函式刪除網格化物件。(一般情況下使用乙個網格化物件即可,多處理器,多執行緒的情況可使用多個網格化物件,以提高效率)
環繞規則用glutessproperty函式指定:
void glutessproperty(glutesselator *tessobj, glenum property, gldouble value);
glutessproperty
第二個引數使用glu_tess_winding_rule
value
對應取值:
glu_tess_winding_odd
預設值,渲染環繞數為奇數的區域
glu_tess_winding_nonzero
渲染環繞數不為0的區域
glu_tess_winding_positive
渲染環繞數為正的區域
glu_tess_winding_negative
渲染環繞數為負的區域
glu_tess_winding_abs_geq_two
渲染環繞數絕對值大於等於2的區域
(被渲染的區域被稱為內部區域)
《opengl程式設計指南》第四版中:「只有一條輪廓線時,每點的環繞數為該繞輪廓一周的過程中經過該點的次數,逆時針為正,順時針為負。有多條輪廓線時,將分別繞個輪廓線一周得到的環繞數相加。每個點都對應乙個有符號的整數值,在同乙個區域內,所有點的環繞數都相同。實際這個定義有誤,在實際程式設計中,如對下面程式左下角和右下角的輪廓線而言,此定義是錯誤的。本人通過實際程式設計認為環繞數應該針對區域中的點,而不是頂點,在輪廓線之外區域環繞數為0,在計算輪廓線的交點後,輪廓應該類似剝洋蔥一樣,一層一層的分析,輪廓線逆時針,則內部區域的環繞數+1,順時針則-1,環繞數應該為計算到最內層輪廓線時各區域得到的值。
環繞規則可用於在計算實體操作時計算輪廓線的並集,差集和交集。
以下是演示環繞規則的**,按p改變環繞規則:
#include
#include
#include "gl/glut.h"
//
注意c++會檢查函式指標型別,而c不會 //
本程式以.c為副檔名,以.cpp為副檔名glutesscallback()函式會出現4個錯誤
#ifndef callback
#define callback
#endif
const char* szcaption = "tess.cpp";
glint nproperty=0;//
環繞規則索引
gldouble tessproperty[5] = ;
gldouble graphics0[3][4][3] = , ,, },
, , , },
, , , }
};
gldouble graphics1[3][4][3] = , ,, },
, , , },
, , , }
};
gldouble graphics2[11][3] = , ,, ,
, , , ,
, ,
};
gldouble graphics3[16][3] = , , , ,
, , , ,
, , , ,
, , ,
};
//
頂點的**函式
void callback vertexcallback(glvoid* vertex)
void callback begincallback(glenum type)
void callback endcallback()
void callback errorcallback(glenum errorcode)
//用於處理檢測輪廓線交點,並決定是否合併頂點, //
新建立的頂點最多可以是4個已有頂點線性組合,這些定點座標儲存在data中 //
其中weight為權重,weight[i]的總合為1.0
void callback combinecallback(gldouble coords[3],
gldouble* data[4],
glfloat weight[4], gldouble ** dataout)
void init()
void drawgraphics(glint ngraphic, glint nproperty)
glutessendpolygon(tessobj);
}
void reshape(glsizei w, glsizei h)
void display()
void keyboard(glubyte key, glint x, glint y)
}
int main(int argc, char** argv)
OpenGL 多邊形偏移
include gltools.h include glshadermanager.h include else define freeglut static include endif gluint list glint spinx 0 glint spiny 0 glfloat tdist 0....
OpenGL 05 Assimp 網格 模型
在learnopengl 學習,記錄一下學習筆記 目錄model 利用assimp庫匯入的模型庫,結構目錄如下 1.首先有將所有的資料讀取儲存到scene 2.每個node節點都會對應乙個mesh,mesh的索引儲存在node中 3.每個material的索引都會儲存在mesh當中 4.每個mesh...
OpenGL 多邊形的鏤空
1.凸多邊形的定義是多邊形的內角均小於180 2.多邊形可以設定鏤空效果,使用glenable gl polygon stipple 開啟鏤空模式,之後使用glpolygonstipple 設定鏤空基本圖案。void glpolygonstipple const glubyte mask mask是...