最近在課程上在學習計算機圖像,對於突然冒出來的好多glut庫里的函數感覺很難招架。把示例代碼一行行百度下來,總算是差不多理解了大概的意思,在這裡分享一下繪製圖像需要的基礎的函數。
1. 配置環境
對於openGL的環境配置可以看我之前寫的環境配置的文章,點擊文章底部左下角「閱讀原文」就可以訪問原文章。
2. main函數設置
基本設置
在繪製圖像前還需要對程序進行初始化
在main函數里需要添加初始化語句
//這個函數用來初始化 GLUT 庫
glutInit(&argc, argv);
//設置顏色模式和緩衝區格式
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);顏色模式:
參數有,GLUT_RGBA模式;GLUT_RGB模式 ;GLUT_INDEX模式
緩衝區類型 :GLUT_SINGLE——單緩衝窗口;GLUT_DOUBLE——雙緩衝窗口
GLUT_SINGLE 實際上就是將所有的繪圖指令在窗口上執行,一般只用於顯示單獨的一副非動態的圖
GLUT_DOUBLE 實際上繪圖指令是在一個緩衝區完成,在繪圖指令完成之後,再通過交換指令把完成的圖形立即顯示在屏幕上,一般用於生成動畫效果
窗體設置
對繪製的窗體的設置,同樣可以寫入main函數中
//設置初始窗口的位置
glutInitWindowPosition(100, 100);
//設置初始窗口的大小
glutInitWindowSize(400, 400);
//根據前面設置建立窗口,參數設置為變體
glutCreateWindow("實驗");
//顏色函數設置
Init();
//繪圖時被調用的函數
glutDisplayFunc(myDisplay);
//改變窗體大小時進行圖像重繪
glutReshapeFunc(Reshape);
//進行消息循環,用於顯示窗體,窗體關閉後自動退出循環
glutMainLoop();glutInitWindowPosition(int x, int y)窗口左上角相對於計算機坐標(x,y)
glutDisplayFunc(myDisplay)其中的 myDisplay 參數為自己設置的成像函數
glutReshapeFunc(Reshape)其中的 Reshape 參數為自己設置的重新成像函數
Reshape函數設置
void Reshape(int w, int h) {
//glViewport負責把視景體截取的圖像按照怎樣的高和寬顯示到屏幕上
gViewport(0, 0, (GLsizei)w, (GLsizei)h);
//將當前矩陣指定為投影矩陣
glMatrixMode(GL_PROJECTION);
//把矩陣設為單位矩陣
lLoadIdentity();
//讓中心坐標(0,0)變成窗口的左下角
gluOrtho2D(0.0, (GLdouble)w, 0.0, (GLdouble)h);
}顏色函數設置
void Init(){
//設置顏色
glClearColor(0.0, 0.0, 0.0, 0.0);
//顏色過渡形式
glShadeModel(GL_FLAT);
}glShadeModel 函數用於控制opengl中繪製指定兩點間其他點顏色的過渡模式
參數一般為 GL_SMOOTH(默認)自然過渡;GL_FLAT 不過渡,顏色有層次
函數用於控制opengl中繪製指定兩點間其他點顏色的過渡模式 參數一般為 GL_SMOOTH(默認)自然過渡 GL_FLAT 不過渡,顏色有層次
3.繪圖函數 myDisplay 函數設置
void myDraw(int a, int b) {
/*other code*/
//指定柵格化點的直徑
glPointSize(1);
//繪圖準備
glBegin(GL_POINTS);
glVertex2i(/*other code*/);
lEnd();
}
}
void myDisplay(void) {
myDraw(a,b)
glFlush();//強制刷新緩衝,保證繪圖命令將被執行
}/* other code */ 為繪圖必要的條件設置
glPointSize(1) 表示圖像直徑為一個像素點,其中的參數可以決定整體圖像的粗細程度
glBegin() 是和 glEnd() 結合起來使用
函數原型 void glBegin(GLenum mode)
mode:創建元素的類型,比如:點,線等。可以是以下數值:
| 函數 | 說明 |
| GL_POINTS | 把每個頂點作為一個點進行處理 |
| GL_LINES | 把每個頂點作為一個獨立的線段 |
| GL_LINE_STRIP | 繪製從第一個頂點到最後一個頂點依次相連的一組線段 |
| GL_LINE_LOOP | 繪製從第一個頂點到最後一個頂點首尾相連的一組線段 |
| GL_TRIANGLES | 把每個頂點作為一個獨立的三角形 |
| GL_TRIANGLE_STPIP | 繪製一組相連的三角形 |
| GL_QUADS | 繪製由四個頂點組成的一組單獨的四邊形 |
| GL_QUAD_STRIP | 繪製一組相連的四邊形 |
在 glBegin() 和 glEnd() 之間需要調用函數繪圖,glVertex() 設置頂點坐標
glVertex2i 輸入整型的點
glVertex2f 輸入單精度的點
glVertex2d 輸入雙精度的點
除此之外還有其他可以在 glBegin() 和 glEnd() 之間調用的函數
| 函數 | 說明 |
| glVertex() | 設置頂點坐標 |
| glColor() | 設置當前顏色 |
| glIndex() | 設置當前顏色表 |
| glNormal() | 設置法向坐標 |
| glCoord() | 產生坐標 |
| glCallList(),glCallLists() | 執行顯示列表 |
| glTexCoord() | 設置紋理坐標 |
| glEdgeFlag() | 控制邊界繪製 |
| glMaterial() | 設置材質 |
4.示例代碼:直線的繪製
#include <GL/glut.h>
#include <math.h>
void myDraw(int x0, int y0, int x1, int y1) {
int m = 0;
if (abs(x1 - x0) >= abs(y1 - y0))
m = abs(x1 - x0);
else
m = abs(y1 - y0);
float dx = (float)(x1 - x0) / m;
float dy = (float)(y1 - y0) / m;
float x = x0;
float y = y0;
glPointSize(1);
for (int i = 0;i < m;i++) {
glBegin(GL_POINTS);
glVertex2i((int)(x + 0.5), (int)(y + 0.5));
glEnd();
x += dx;
y += dy;
}
}
void myDisplay(void) {
myDraw(0, 0, 200, 300);
glFlush();
}
void Init() {
glClearColor(0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_FLAT);
}
void Reshape(int w, int h) {
glViewport(0, 0, (GLsizei)w, (GLsizei)h);
lMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, (GLdouble)w, 0.0, (GLdouble)h);
}
int main(int argc, char *argv[]) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(100, 100);
glutInitWindowSize(400, 400);
glutCreateWindow("實驗1 直線繪製");
Init();
glutDisplayFunc(myDisplay);
glutReshapeFunc(Reshape);
lutMainLoop();
return 0;
}原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/225309.html
微信掃一掃
支付寶掃一掃