這節開始前我們先了解一下圖元的概念。圖形軟件包中用來描述各種圖形元素的函數稱為圖形輸出原語,也稱圖元(primitive)。而描述對象幾何要素的輸出圖元一般稱為幾何圖元。點和線是最簡單的幾何圖元,本節就會簡單介紹點和線段的繪制方法。
一、坐標系統。
坐標系統一般分為屏幕坐標和OpenGL中的繪圖坐標。
在上一節中我們簡單的寫了個示例程序,程序中介紹了gluOrtho2D命令。我們可以利用該命令設定一個二維笛卡爾坐標系。該函數的四個變量制定的是顯示圖形x和y坐標范圍。所以我們可以使用下面代碼制定一個正交投影的二維坐標系:
glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0, 800.0, 0.0, 600.0);
在建立圖形的幾何描述時,所有OpenGL圖元的位置必須用gluOrtho2D函數定義的坐標系統中的絕對坐標給出。
二、OpenGL畫點函數
使用下面的函數可以指定一個點的位置和坐標:
glVertex* ();這里*號表示該函數需要有后綴碼,這些后綴碼用來指明空間的尺寸、坐標值的數據類型和可能的向量形式坐標描述。
在上一節我們看到繪制圖形時使用如下代碼:
glBegin(GL_POINTS); glVertex2i(700, 15); glVertex2i(100, 555); glEnd();glBegin();函數用來指定要顯示的圖元類型,在繪制點的時候,圖元類型常量是:GL_POINTS,begin和end之間必須有glVertex*();函數。用於指定數值的數據類型的后綴是:i(整數)、s(短整數)、f(浮點數)、d(雙精度浮點數)。下面例子中我們繪制了三個點:
glBegin(GL_POINTS); glVertex2i(25, 25); glVertex2i(50, 50); glVertex2i(100, 100); glEnd();換一種方法,我們可以用矩陣來描述點:
int p1[]{25, 25};
int p2[]{50, 50};
int p3[]{100, 100};
glBegin(GL_POINTS);
glVertex2iv(p1);
glVertex2iv(p2);
glVertex2iv(p3);
glEnd(); 最后,繪制點的完整代碼為:
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <iostream>
#include <string>
#include <windows.h>
#include <GL\glut.h>
using namespace std;
void piontSegment(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 0.0, 0.0);
//通過點繪制
glBegin(GL_POINTS);
glVertex2i(25, 25);
glVertex2i(50, 50);
glVertex2i(100, 100);
glEnd();
//通過矩陣繪制
/*int p1[]{25, 25};
int p2[]{50, 50};
int p3[]{100, 100};
glBegin(GL_POINTS);
glVertex2iv(p1);
glVertex2iv(p2);
glVertex2iv(p3);
glEnd();*/
glFlush();
}
int _tmain(int argc, char **argv)
{
glutInit(&argc, argv);
//設置窗口的緩存和顏色模型
//下面指定的是:窗口使用單個緩存並且使用RGB顏色模型來設定顏色值。
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
//設置窗口左上角的位置
glutInitWindowPosition(400, 200);
//設置窗口的寬高
glutInitWindowSize(800, 600);
glutCreateWindow("Test OpenGL Program");
//設置顯示窗口的背景為白色。參數順序為:紅、綠、藍、透明度。
glClearColor(1.0, 1.0, 1.0, 0.0);
//設置投影類型:正投影
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
//觀察參數:x坐標值從0到200,y是從0到150
gluOrtho2D(0.0, 800.0, 0.0, 600.0);
glutDisplayFunc(piontSegment);
glutMainLoop();
system("pause");
return 0;
}
三、畫線函數
上節我們就寫了個簡單的畫線函數GL_LINES,使用GL_LINES可以連接一對相鄰端點完成一條直線段,如果描述端點的坐標只有一個則社么都不會顯示,如果端點數為奇數那么最后一個點將被舍棄。如下代碼:
glBegin(GL_LINES); glVertex2i(700, 15); glVertex2i(100, 555); glVertex2i(50, 150); glVertex2i(400, 500); glVertex2i(10, 400); glEnd();最后一個點(80,400)將會被舍棄,輸出的圖形將會如下:

使用OpenGL的圖元常量GL_LINE_STRIP時,我們可以獲得折線,即會按照端點順序進行連接,直到最后一個端點,代碼如下:
glBegin(GL_LINE_STRIP); glVertex2i(700, 15); glVertex2i(100, 555); glVertex2i(50, 150); glVertex2i(400, 500); glVertex2i(10, 400); glEnd();繪制的圖形如下:

接着是最后一個常量參數:GL_LINE_LOOP和上一個不同點就是它會把最后一個點和第一個點相連,組成一個循環,代碼:
glBegin(GL_LINE_LOOP); glVertex2i(700, 15); glVertex2i(100, 555); glVertex2i(50, 150); glVertex2i(400, 500); glVertex2i(10, 400); glEnd();生成的圖形如下:

這樣點和線我們都能繪制了,下節我們將會介紹一下畫線算法。
參考內容:《計算機圖形學(第三版)》 電子工業出版社
轉載請標明出處:http://blog.csdn.net/letthinking/article/details/39161019
