貝賽爾(Bezier)『曲面』與『曲線』相比不同之處在於多咗v空間域.曲面函式s(u,v).曲面演示程式按空格鍵在線框、填充、紋理模式中切換:下載
1.對曲面進行柵格映射
void glMap2f(GLenum target,GLfloat u1,GLfloat u2,GLint ustride,GLint uorder,GLfloat v1,GLfloat v2,GLint vstride,GLint vorder,const GLfloat *points);
函式示例:
glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3,u, 0,1, 3v,3, (GLfloat)bezier->control_array);
參數 | 簡介 |
target | 控制點類型 |
u1,u2 | u空間域參數的定義域(u1~u2) |
ustride | u空間域頂點跨度 |
uorder | u空間域頂點個數 |
v1, v2 | v空間域參數的定義域(u1~u2) |
vstride | v空間域頂點跨度 |
vorder | v空間域頂點個數 |
points | 定點數組 |
控制點類型(target) | 簡介 |
GL_MAP1_VERTEX_3 | 頂點座標(x,y,z) |
GL_MAP1_VERTEX_4 | 頂點座標(x,y,z,w) |
GL_MAP1_INDEX | 顏色索引 |
GL_MAP1_COLOR_4 | 顏色值(RGBA) |
GL_MAP1_NORMAL | 法線座標 |
GL_MAP1_TEXTURE_COORD_1 | 紋理座標(s) |
GL_MAP1_TEXTURE_COORD_2 | 紋理座標(s,t) |
GL_MAP1_TEXTURE_COORD_3 | 紋理座標(s,t,r) |
GL_MAP1_TEXTURE_COORD_4 | 紋理座標(s,t,r,g) |
2.啟用貝賽爾(Bezier)曲面
glEnable(GL_MAP2_VERTEX_3);
3.定義定義均勻的柵格,並設置間隔個數
void glMapGrid2f(GLint un,GLfloat u1,GLfloat u2,GLint vn,GLfloat v1,GLfloat v2);
函式示例:
glMapGrid2f(10,0, 10, 10, 0, 10);
參數 | 簡介 |
un | u域[u1~u2]間隔個數,必須為正 |
u1 | u1=0 |
u2 | u2=un |
vn | v域[v1~v2]間隔個數,必須為正 |
v1 | v1=0 |
v2 | v2=vn |
- 根據柵格設置繪製曲面
void glEvalMesh2(GLenum mode,GLint i1,GLint i2,GLint j1,GLint j2);
函式示例:
glEvalMesh2(GL_FILL, 0, 10, 0, 10);
參數 | 簡介 |
mode | 繪畫模式
GL_POINT:點 GL_LINE:直線 GL_FILL:填充 |
i1,i2 | u空間域的範圍 |
j1,j2 | v空間域的範圍 |
5.為曲面生成法線用於光照
glEnable(GL_AUTO_NORMAL);
6.對曲面進行紋理映射
glMap2f(GL_MAP2_TEXTURE_COORD_2, 0,1,2, 2,0,1, 4,2,(GLfloat*)bezier->texture_coord);
對曲面進行紋理映射glMap2f() | 簡介 |
target | 紋理座標(s,t):GL_MAP2_TEXTURE_COORD_2(睇上表) |
u1,u2 | s空間域:[0~1] |
ustride | s紋理座標頂點跨度:2 |
uorder | s空間域頂點個數:2 |
v1,v2 | t空間域:[0~1] |
vstride | t紋理座標頂點跨度:4 |
vorder | t空間域頂點個數:2 |
points | 紋理座標:{0.0, 0.0}, {0.0, 1.0}, {1.0, 0.0}, {1.0, 1.0} |
4.啟用曲面紋理座標
glEnable(GL_MAP2_TEXTURE_COORD_2);