OpenGL規定,一個多邊形必須是一個“凸多邊形”。注意:如果使用的多邊形不是凸多邊形,
則最後輸出的效果是未定義的——OpenGL為了效率,放寬了檢查,這可能導致顯示錯誤。
要避免這個錯誤,盡量使用三角形,因為三角形都是凸多邊形。
一、指定點
opengl提供的指定點的函數格式:glVertex+1個數字+1~2字母,如
glVertex2d glVertex2f glVertex3f glVertex3fv
其中數字代表參數的個數
字母表示參數類型:
s 16位整數 GLshort
i 32位整數 GLint和GLsizei
f 32位浮點數 GLfloat和GLclampf
d 64位浮點數 GLdouble和GLclampd
v 傳遞的參數為指標
如下面的5個程式碼片段功能相同
(一)glVertex2i(1, 3);
(二)glVertex2f(1.0f, 3.0f);
(三)glVertex3f(1.0f, 3.0f, 0.0f);
(四)glVertex4f(1.0f, 3.0f, 0.0f, 1.0f);
(五)GLfloat VertexArr3[] = {1.0f, 3.0f, 0.0f};
glVertex3fv(VertexArr3);
二、開始繪製
glBegin(GL_POINTS);
glVertex2f(0.0f, 0.0f);
glVertex2f(0.5f, 0.0f);
glEnd();
上述GL_POINTS指示將畫兩個點,如果換成GL_LINES則會用兩點畫成一條線,當然
還可以換成還有GL_LINE_STRIP,GL_LINE_LOOP,GL_TRIANGLES,
GL_TRIANGLE_STRIP,GL_TRIANGLE_FAN等,每種方式的大致效果見:
下面是幾個執行個體
畫圓
#include<gl/glut.h>#include<math.h>const int n = 20;const GLfloat R = 0.5f;const GLfloat Pi = 3.1415926536f;// 採用畫正n邊形法畫圓,效率較低void myDisplay(void){glClear(GL_COLOR_BUFFER_BIT);glBegin(GL_POLYGON);for (int i=0; i<n; i++)glVertex2f(R*cos(2*Pi*i/n), R*sin(2*Pi*i/n));glEnd();glFlush();}int main(int argc, char* argv[]){glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); glutInitWindowPosition(100, 100);glutInitWindowSize(400, 400);glutCreateWindow("畫圓");glutDisplayFunc(myDisplay);glutMainLoop();return 0;}
畫五角星
#include<gl/glut.h>#include<math.h>const GLfloat Pi = 3.1415926536f;// 畫五角星// 座標原點在正五邊形的中心void myDisplay(void){GLfloat a = 0.5; // 座標原點到A點距離(按opengl的距離意義)GLfloat bx = a * cos(18 * Pi / 180);GLfloat by = a * sin(18 * Pi / 180);GLfloat cx = a * cos(54 * Pi / 180);GLfloat cy = - a * sin(54 * Pi / 180);GLfloat PointA[2] = {0, a};GLfloat PointB[2] = {bx, by};GLfloat PointC[2] = {cx, cy};GLfloat PointD[2] = {-cx, cy};GLfloat PointE[2] = {-bx, by};glClear(GL_COLOR_BUFFER_BIT);// A -> C -> E -> B -> D -> AglBegin(GL_LINE_LOOP);glVertex2fv(PointA);glVertex2fv(PointC);glVertex2fv(PointE);glVertex2fv(PointB);glVertex2fv(PointD);glEnd();glFlush();}int main(int argc, char* argv[]){glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); glutInitWindowPosition(100, 100);glutInitWindowSize(400, 400);glutCreateWindow("畫五角星");glutDisplayFunc(myDisplay);glutMainLoop();return 0;}