在3D中畫直線需要指定兩個頂點。如下代碼:會在兩點之間畫一條直線
glBegin(GL_LINES);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(50.0f, 25.0f, 0.0f);
glEnd();
這裡用兩個頂點指定了一個圖元。注意如果為GL_LINES指定奇數個頂點,那麼最後一個頂點將被忽略。
static void RenderScene()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0f, 1.0f, 0.0f);
GLfloat x, y, z, angle;
z = -50.0f;
//畫線
glBegin(GL_LINES);
for (angle = 0.0f; angle <= 2*GL_PI*3; angle +=0.5f)
{
x = 50.0f * cos(angle);
y = 50.0f * sin(angle);
//設置兩個頂點
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(x, y, z);
z += 0.5f;
}
glEnd();
glutSwapBuffers();
}
效果如下圖:
繪制一條連續的線,使用GL_LINE_STRIP,會繪制一條經過所有這些頂點的連續的線。實例如下:
glBegin(GL_LINE_STRIP);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(50.0f, 50.0f, 0.0f);
glVertex3f(50.0f, 100.0f, 0.0f);
glEnd();
GL_LINE_LOOP,與GL_LINE_STRIP相似。只是最後一個頂點和第一個頂點之間也會繪制一條直線,形成閉合的線。
繪制近似曲線可以使用GL_LINE_STRIP來鏈接所有的點。當點之間的距離越來越近時,就可以形成一條平滑的曲線。示例如下:
//繪制場景
static void RenderSences()
{
GLfloat z = -50.0f;
//清空畫布
glClear(GL_COLOR_BUFFER_BIT);
//設置畫圖使用的顏色
glColor3f(1.0f, 0.0f, 0.0f);
//保存矩陣
glPushMatrix();
//旋轉, 如果不旋轉,那些不同層次的點都重疊在一起,看不出3D效果了。
glRotatef(200.0f, 1.0f, 0.0f, 0.0f);
glRotatef(120.5f, 0.0f, 1.0f, 0.0f);
glBegin(GL_LINE_STRIP);
for (GLfloat a = 0.0; a < GL_PI * 3.0f; a += 0.1f)
{
GLfloat x = 50.0f * cos(a);
GLfloat y = 50.0f * sin(a);
//設置點的大小
//設置頂點
glVertex3f(x, y, z);
//調整z值
z += 0.5f;
}
glEnd();
glPopMatrix();
glFlush();
}
與設置點的寬度類似,我們也可以設置直線的寬度。但直線的寬度設置也是有限制的。我們可以取得直線寬度的范圍,以及其寬度增長的最小間隔。
代碼如下
GLfloat width[2]; //存儲直線的寬度范圍
GLfloat step; //存儲受支持的直線寬度增量
//獲取受支持的直線寬度范圍和增量
glGetFloatv(GL_LINE_WIDTH_RANGE, width);
glGetFloatv(GL_LINE_WIDTH_GRANULARITY, &step);
示例:
static void RenderScene()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0f, 1.0f, 0.0f);
//獲取直線的寬度
GLfloat width[2];
GLfloat step;
glGetFloatv(GL_LINE_WIDTH_RANGE, width);
glGetFloatv(GL_LINE_WIDTH_GRANULARITY, &step);
GLfloat y, curWidht;
curWidht = width[0];
curWidht += step;
//畫線
for (y = 80.0f; y > -80.0f; y -= 10.0f)
{
glLineWidth(curWidht);
curWidht += step;
glBegin(GL_LINES);
glVertex2f(-50.0f, y);
glVertex2f(50.0f, y);
glEnd();
}
glutSwapBuffers();
}
使用點線或虛線模式來繪制直線,稱為點畫。啟用點畫模式glEnable(GL_LINE_STIPPLE);
然後可以使用glLineStipple函數創建這種模式。
void glLineStipple(
GLint
factor,
GLushort
pattern)
;
注意:模式的順序是反過來的,這樣的原因是OpenGL左移一位獲得下一個掩碼值的速度更快。
例子:
static void RenderScene()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0f, 1.0f, 0.0f);
//開啟stipple模式
glEnable(GL_LINE_STIPPLE);
GLfloat y;
GLint factor = 1;
GLushort patter = 0x5555;
//畫線
for (y = 80.0f; y > -80.0f; y -= 10.0f)
{
//設置因子和模式
glLineStipple(factor, patter);
glBegin(GL_LINES);
glVertex2f(-50.0f, y);
glVertex2f(50.0f, y);
glEnd();
factor++;
}
glutSwapBuffers();
}
示例代碼地址:https://github.com/sweetdark/openglex/tree/master/drawline
OpenGL超級寶典 第4版 中文版PDF+英文版+源代碼 見 http://www.linuxidc.com/Linux/2013-10/91413.htm
OpenGL編程指南(原書第7版)中文掃描版PDF 下載 http://www.linuxidc.com/Linux/2012-08/67925.htm
OpenGL 渲染篇 http://www.linuxidc.com/Linux/2011-10/45756.htm
Ubuntu 13.04 安裝 OpenGL http://www.linuxidc.com/Linux/2013-05/84815.htm
OpenGL三維球體數據生成與繪制【附源碼】 http://www.linuxidc.com/Linux/2013-04/83235.htm
Ubuntu下OpenGL編程基礎解析 http://www.linuxidc.com/Linux/2013-03/81675.htm
如何在Ubuntu使用eclipse for c++配置OpenGL http://www.linuxidc.com/Linux/2012-11/74191.htm
更多《OpenGL超級寶典學習筆記》相關知識 見 http://www.linuxidc.com/search.aspx?where=nkey&keyword=34581