本次主要简单学习OpenGL中相关图形绘制的一些API。
以下程序主要是点的大小、直线线性和线宽绘制的示例。
#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()函数传递同一个参数
(2)void glPointSize(GLfloat size); 使用这个函数设置一个点像素大小
(3) void glLineWidth(GLfloat width) ; 使用这个函数指定线宽