OpenGL(二)图形绘制之点线绘制

本次主要简单学习OpenGL中相关图形绘制的一些API。



OpenGL(二)图形绘制之点线绘制_第1张图片

OpenGL(二)图形绘制之点线绘制_第2张图片

以下程序主要是点的大小、直线线性和线宽绘制的示例。

#include
#include
#include
#include
#include

//窗口的大小
GLsizei windowWidth;
GLsizei windowHeight;


void ReaderScene(void )
{
	//用当前背景色填充窗口
	glClear(GL_COLOR_BUFFER_BIT);
	//设置当前的绘图RGB颜色
	glColor3f(0.0f,0.0f,0.0f);

	//    控制画点大小,一般是如下代码结构
	GLfloat sizes[2];   //保存绘制点的尺寸范围
	GLfloat step;       //保存绘制点尺寸的步长
	GLfloat curSize;    //当前绘制的点的大小
	glGetFloatv(GL_POINT_SIZE_RANGE, sizes);
	glGetFloatv(GL_POINT_SIZE_GRANULARITY,&step);


	//sizes保存了glLineWidth的最小有效值和最大有效值
	//step保存线宽允许的最小增量
	//granularity  尺寸间隔意思
	//printf("curSize=%lf\n sizes1= %lf\tsizes2=%lf\n", curSize,sizes[0],sizes[1]);
	//输出结果是 1.000000 1.000000 63.37500

	curSize = sizes[0];
	//绘制不同大小的点
	for (int i = 0; i < 5; ++i)
	{
		glPointSize(curSize);
		glBegin(GL_POINTS);
		    glVertex3f(25.0+i*8,200.0f,0.0f);
		glEnd();
		curSize += step;
	}
    //绘制一条宽度为5的直线 (25.160)->(225,160)
	glLineWidth(5);
	glBegin(GL_LINES);
		glVertex3f(25.0,160.0f,0.0f);
		glVertex3f(225.0f,160.0f,0.0f);
	glEnd();

	//绘制一条虚线
	glEnable(GL_LINE_STIPPLE);//驱动“点画”绘制
	glLineStipple(1,0x00FF);//设置"点画"划线模式

	glBegin(GL_LINES);
		glVertex3f(25.0f,120.0f,0.0f);
		glVertex3f(225.0f,120.0f,0.0f);
	glEnd();
	//理解glLinestipple
	//glLineStipple — specify the line stipple pattern
	//void glLineStipple(	GLint factor,
	//GLushort pattern);

	//绘制一条宽度为3的点划线
	glLineWidth(3);
	glLineStipple(1,0x00FF);
	glBegin(GL_LINES);
	    glVertex3f(25.0f,80.0f,0.0f);
		glVertex3f(100.0f,80.0f,0.0f);
	glEnd();

	//增加重复因子绘制的点划线
	glLineStipple(2, 0x00FF);
	glBegin(GL_LINES);
	glVertex3f(25.0f, 40.0f, 0.0f);
	glVertex3f(100.0f, 40.0f, 0.0f);
	glEnd();
	//关闭“点画”模式
	glDisable(GL_LINE_STIPPLE);


	//刷新OpenGL命令队列
	glFlush();
	
}
void ChangeSize(GLsizei w,GLsizei h)
{
	if (h == 0)
		h = 1;
	glViewport(0,0,w,h);

	//重置坐标系统
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();


	//建立修剪空间的范围
	if (w <= h)
	{
		windowWidth = 250.0f;
		windowHeight = 250.0f*h / w;
	}
	else
	{
		windowWidth = 250.0f*h / w;
		windowHeight = 250.0f;
	}
	glOrtho(0.0f,windowWidth,0.0f,windowHeight,1.0f,-1.0f);

	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	
}

void SetupRC()
{
	//使用背景为蓝色
	glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
}

void main(void )
{
	//初始化显示的模式
	glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
	//创建一个窗口
	glutCreateWindow("fuoifas");


	glutDisplayFunc(ReaderScene);
	glutReshapeFunc(ChangeSize);

	SetupRC();
	//启动主GLUT事件处理循环
	glutMainLoop();
	
}


主要学习点:

(1)理解viod glLineStipple(glint factor,GLshort pattern); 
    OpenGL中设置直线的当前点画模式。pattern参数是由1或0组成的16位序列,它们根据需要进行重复,对一条特定的直线进行点画处理。从这个模式的低位开始,一个像素一个像素的进行处理。如果模式中对应的位是1,就绘制这个像素,否则就不绘制。模式可以使用factor参数(表示重复因子)进行扩展,它与1和0的连续子序列相乘。因此,如果模式中出现了3个1,并且factor是2,那么它们就扩展为6个连续的1。必须以GL_LINE_STIPPLE为参数调用glEnable()才能启用直线点画功能。为了禁用直线点画功能,可以向glDisable()函数传递同一个参数

OpenGL(二)图形绘制之点线绘制_第3张图片

(2)void glPointSize(GLfloat size);   使用这个函数设置一个点像素大小

(3)  void glLineWidth(GLfloat width)  ;  使用这个函数指定线宽


你可能感兴趣的:(OpenGL)