现在的位置: 首页 > 综合 > 正文

[OpenGL]图元的绘制——空间点/直线;图元整理

2019年01月09日 ⁄ 综合 ⁄ 共 3953字 ⁄ 字号 评论关闭

glBegin可支持的OpenGL图元

模式

图元类型

GL_POINTS
 单个顶点集

将指定的各个顶点用于创建单个的点

GL_LINES
多组双顶点线段
将指定顶点用于创建线段。两个顶点指定一条单独的线段。如果顶点个数是奇数,则忽略最后一个
GL_LINE_STRIP
不闭合折线
将指定的顶点用于创建线段。每个顶点之后的每个顶点指定的是线条延伸到的下一个点
GL_LINE_LOOP
闭合折线
特性和GL_LINE_STRIP相似,只不过最后一条线段是在指定的最后一个和第一个顶点之间绘制。典型情况下,这用于绘制那些可能违反了GL_POLYGON用法规则的封闭区域。
GL_TRIANGLES
多组独立填充三角形
将指定的顶点用于构造三角形。每三个顶点指定一个新三角形。如果顶点个数不是三的倍数,多余的顶点将被忽略。
GL_TRIANGLE_STRIP
线型连续填充三 角形
将指定的顶点用于创建三角形。指定前三个顶点之后,后继的每个顶点与它前面两个顶点一起用于构成下一个三角形。每个顶点三元组(在最初的组之后)会自动重新排列以确保三角形绕法的一致性。
GL_TRAINGLE_FAN
扇形连续填充三角形
将指定的顶点用于构造三角扇形。第一个顶点充当原点,第三个定
GL_QUADS
多组独立填充四边形
每四个顶点一组用于构造一个四边形。如果顶点个数不是四的倍数,多余的顶点将被忽略
GL_QUADS_STRIP
连续填充四边形
将指定的顶点用于构造四条形边。在第一对顶点之后,每对顶点定义一个四边形。和GL_QUADS的顶点顺序不一样,每对顶点以指定顺序的逆序使用,以便保证绕法的一致。
GL_POLYGON
单个简单填充凸多边形
将指定的顶点用于构造一个凸多边形。多边形的边缘决不能相交。最后一个顶点会自动连接到第一个顶点以确保多边形是封闭的

//点的大小,直线线型和线宽的示例
#include <gl/glut.h>
/*点的绘制
OpenGL中定义的点放在函数glBegin()和glEnd()之间,有函数glBegin()的参数指定绘制图元的类型。
在OpenGL中绘制一个点时,点大小的默认值是一个像素。可以用函数glPointSize(GLfloat size)修改这个值。这个函数采用一个参数来指定画点时以像素为单位的近似直径。但是不是任意大小点都支持,通常使用下面的代码来获取点大小的范围和他们的之间最小的中间值:
GLfloat sizes[2];//保存绘制点的尺寸范围
GLfloat step;//保存绘制点尺寸的步长
glGetFloatv(GL_POINT_SIZE_RANGE,sizes);
glGetFloatv(GL_POINT_SIZE_RANULARITY,&step);
在OpenGL程序中,我们常可以利用离散的点来拟合一些常见的曲线,如圆,螺旋线等待。
*/
void RenderScene()
{
    glClear(GL_COLOR_BUFFER_BIT);
    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);//获得点尺寸的步长

    //绘制不同大小的点
    curSize = sizes[0];
    for (int i=0; i < 25; i++)
    {
        glPointSize(curSize);//设置点的大小
        glBegin(GL_POINTS);
        glVertex3f(25.0+i*8,200.0f,0.0f);
        glEnd();
        curSize += step * 2;
    }
    //绘制一条宽度为5的直线
    glLineWidth(5);//设置线宽
    glBegin(GL_LINES);
    glVertex3f(20.0f,150.0f,0.0f);
    glVertex3f(220.0f,150.0f,0.0f);
    glVertex3f(200.0f,160.0f,0.0f);
    glVertex3f(200.0f,160.0f,0.0f);
    glEnd();

    //在xy平面内绘制了两条直线(0,0,0)到(10,0,0)和(0,10,0)到(20,5,0).
    glBegin(GL_LINE_STRIP);
    glVertex3f(0.0f,0.0f,0.0f);
    glVertex3f(10.0f,10.0f,0.0f);
    glVertex3f(20.0f,5.0f,0.0f);
    glEnd();
    
    //画了一个三角形
    glBegin(GL_LINE_LOOP);
    glVertex3f(100.0f,100.0f,0.0f);
    glVertex3f(150.0f,150.0f,0.0f);
    glVertex3f(200.0f,50.0f,0.0f);
    glEnd();

    //绘制一条虚线 
    glEnable(GL_LINE_STIPPLE);
    glLineStipple(1,0x00ff);//设置点划线模式
    glBegin(GL_LINES);
    glVertex3f(20.0f,120.0f,0.0f);
    glVertex3f(220.0f,120.0f,0.0f);
    glEnd();

    //绘制一条宽度为3的点划线 
    glLineWidth(3); 
    glLineStipple(1,0xff0c);
    glBegin(GL_LINES);
    glVertex3f(20.0f,80.0f,0.0f);
    glVertex3f(220.0f,80.0f,0.0f);
    glEnd();
    //增加重复因子绘制的点划线 
    glLineStipple(4,0xFF0C);
    glBegin(GL_LINES);
    glVertex3f(20.0f,40.0f,0.0f);
    glVertex3f(220.0f,40.0f,0.0f);
    glEnd();
    glDisable(GL_LINE_STIPPLE);

    glFlush();
}
/*直线的绘制
使用模式GL_LINES可以在两点之间画线;
有时我们需要在一系列的顶点之间绘制连续直线,此时需要用到GL_LINE_STRIP或GL_LINE_LOOP模式。GL_LINE_STRIP模式可以根据指定的一系列顶点,从一个顶点到另一个顶点用连续的线段画线。特别的,当沿着某条曲线指定一系列靠的很近的点,使用GL_LINE_STRIP模式可以绘制一条曲线。
GL_LINE_LOOP模式与GL_LINE_STRIP模式类似,只是会在指定的最后一个顶点与第一个顶点之间画最后一条线。
直线的属性包括线宽和线型。在OpenGL中可用 void glLineWidth(GLfloat width)指定线宽。
可以用下面的代码来获取线宽范围和他们的之间的最小间隔:
GLfloat sizes[2];//保存线宽的尺寸范围
GLfloat step;//保存线宽尺寸的最小间隔
glGetFloarv(GL_LINE_WIDTH_RANGE,sizes);
glGetFloarv(GL_LINE_WIDTH_GRANULARITY,&step);
数组sizes中保存了glLineWidth的最小有效值和最大有效值,而变量step将保存线宽之间允许的最小增量。
Microsoft的OpenGL实现允许线宽从0.5到10.0,最小增量为0.125.
除了修改线宽,可以用虚线或短划线么事创建直线,为此需要先调用glEnable(GL_LINE_STIPPLE);然后调用glLineStipple(GLint factor,GLushort pattern);来创建画线的模式。pattern是一个16位值,它指定了画线是所用的模式,每一位代表线段的一部分是开还是关。默认情况下,每一位对应一个像素,但factor参数充当倍数可以增加模式的宽度。另外在应用模式时,pattern是逆向使用的,即模式的最低有效位最先作用于指定线段。
*/
void ChangeSize(GLsizei w,GLsizei h)
{
    if(h == 0)
    {
        h = 1;
    }
    glViewport(0,0,w,h);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    if (w <= h)
    {
        glOrtho(0.0f,250.0f,0.0f,250.0f*h/w,1.0f,-1.0f);
    }
    else
    {
        glOrtho(0.0f,250.0f*w/h,0.0f,250.0f,1.0f,-1.0f);

    }
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}
void SetupRC()
{
    glClearColor(1.0f,1.0f,1.0f,1.0f);
}
void main()
{
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
    glutCreateWindow("点与线");
    glutDisplayFunc(RenderScene);
    glutReshapeFunc(ChangeSize);
    SetupRC();
    glutMainLoop();
}
/*
在上面的程序中,由于OpenGL使用的是一种状态机制,故此我们在绘制第一条直线前设置线宽为5,不仅影响了第一条直线,还使绘制的虚线线宽也为5,直到在绘制第一条点划线前将线宽该为3为止,这样后面绘制的直线均为3,直到再次修改为止。故此在绘制图形的时候,尽可能将状态相同或部分状态相同的图形放在一起绘制,可以提高程序的执行效率。
*/

效果图:

抱歉!评论已关闭.