openGL常见函数意义

最近在课程上在学习计算机图像,对于突然冒出来的好多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负责把视景体截取的图像按照怎样的高和宽显示到屏幕上
    glViewport(0, 0, (GLsizei)w, (GLsizei)h);
       //将当前矩阵指定为投影矩阵    glMatrixMode(GL_PROJECTION);

       //把矩阵设为单位矩阵    glLoadIdentity();

       //让中心坐标(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*/);
   glEnd();
   }
}
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() 设置材质
  1. 示例代码:直线的绘制
#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);
	glMatrixMode(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);
	glutMainLoop();
	return 0;
}
posted @ 2021-04-07 10:26  代码的边城  阅读(184)  评论(0编辑  收藏  举报