http://blog.sina.com.cn/s/blog_986c47a70101hujw.html
如何指定一個點呢?OpenGL提供了一系列函數。它們都以glVertex開頭,后面跟一個數字和1~2個字母。例如:
glVertex2d
glVertex2f
glVertex3f
glVertex3fv
等等。
數字表示參數的個數,2表示有兩個參數,3表示三個,4表示四個(我知道有點羅嗦~)。
字母表示參數的類型,s表示16位整數(OpenGL中將這個類型定義為GLshort),
i表示32位整數(OpenGL中將這個類型定義為GLint和GLsizei),
f表示32位浮點數(OpenGL中將這個類型定義為GLfloat和GLclampf),
d表示64位浮點數(OpenGL中將這個類型定義為GLdouble和GLclampd)。
v表示傳遞的幾個參數將使用指針的方式,見下面的例子。
這些函數除了參數的類型和個數不同以外,功能是相同的。例如,以下五個代碼段的功能是等效的:
(一)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);
以后我們將用glVertex*來表示這一系列函數。
注意:OpenGL的很多函數都是采用這樣的形式,一個相同的前綴再加上參數說明標記
假設現在我已經指定了若干頂點,那么OpenGL是如何知道我想拿這些頂點來干什么呢?是一個一個的畫出來,還是連成線?或者構成一個多邊形?或者做其它什么事情?
為了解決這一問題,OpenGL要求:
指定頂點的命令必須包含在glBegin函數之后,glEnd函數之前(否則指定的頂點將被忽略)。並由glBegin來指明如何使用這些點。
例如我寫:
glBegin(GL_POINTS);
glVertex2f(0.0f, 0.0f);
glVertex2f(0.5f, 0.0f);
glEnd();
則這兩個點將分別被畫出來。如果將GL_POINTS替換成GL_LINES,則兩個點將被認為是直線的兩個端點,OpenGL將會畫出一條直線。
例如畫一個五角星
#include
const GLfloat Pi = 3.1415926536f;
void myDisplay(void)
{
GLfloat a = 1 / (2-2*cos(72*Pi/180));
GLfloat bx = a * cos(18 * Pi/180);
GLfloat by = a * sin(18 * Pi/180);
GLfloat cy = -a * cos(18 * Pi/180);
GLfloat
PointA[2] = { 0, a },
PointB[2] = { bx, by },
PointC[2] = { 0.5, cy },
PointD[2] = { -0.5, cy },
PointE[2] = { -bx, by };
glClear(GL_COLOR_BUFFER_BIT);
// 按照A->C->E->B->D->A的順序,可以一筆將五角星畫出
glBegin(GL_LINE_LOOP);//依次一個點連一個點
glVertex2fv(PointA);
glVertex2fv(PointC);
glVertex2fv(PointE);
glVertex2fv(PointB);
glVertex2fv(PointD);
glEnd();
glFlush();
}
****************************************************************
這里要復習下的是筆記1里面的框架,這是一個簡單的框架
#include
void myDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glRectf(-0.5f, -0.5f, 0.5f, 0.5f);
glFlush();
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(100, 100);
glutInitWindowSize(400, 400);
glutCreateWindow("第一個OpenGL程序");
glutDisplayFunc(&myDisplay);
glutMainLoop();
return 0;
}
這個階段我們要做練習,其實就是改一改myDisplay這個函數的實現
