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

3455人阅读 评论(0) 收藏 举报
分类:

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,直到再次修改为止。故此在绘制图形的时候,尽可能将状态相同或部分状态相同的图形放在一起绘制,可以提高程序的执行效率。
*/
效果图:

查看评论

Win32 OpenGL编程(3) 基本图元(点,直线,多边形)的绘制

Win32 OpenGL编程(3) 基本图元(点,直线,多边形)的绘制write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie讨论新闻组及文件一、   提要在...
  • vagrxie
  • vagrxie
  • 2009-10-13 13:27:00
  • 8677

OpenGL3-绘制各种图元绘制

代码下载 #include "CELLWinApp.hpp"#include #include #include #pragma comment(lib,"opengl32.lib")#pragma...
  • qq_26280299
  • qq_26280299
  • 2015-07-03 14:59:28
  • 577

【OpenGL】绘制基本图元

我们知道,大千世界,千奇百态,但是其基本组成都是一样的,都是由原子所组成。不同的原子经过各种各样的变换,构成了我们多姿多彩的世界。对于计算机图形学也是这样,那些逼真,酷炫的场景都离不开组成这些模型的基...
  • qq_36165459
  • qq_36165459
  • 2017-03-15 00:14:57
  • 494

OPENGL 绘制基本图元

glColor3f(1.0,0.0,0.0);//设置颜色 glBegin(GL_TRIANGLES);//开始绘制,参数可选 glEnd(); 1.绘制矩形 glRectf(-0.5...
  • lan354898254
  • lan354898254
  • 2015-04-09 10:27:14
  • 693

code_opengl学习笔记3-opengl绘制图元

  • 2013年10月01日 19:18
  • 7.74MB
  • 下载

OpenGL笔记之绘制几何图元(geometric primitives)

本文是学习OpenGL过程中的一篇笔记。在学习过程中,主要参照了大名鼎鼎的 《OpenGL Programming Guide》(中文名《OpenGL编程指南》,有些人还称之为OpenGL红宝书...
  • imyfriend
  • imyfriend
  • 2012-08-02 16:59:21
  • 3300

计算机图形学(二)输出图元_14_OpenGL像素阵列函数_3_光栅操作

除了将像素阵列存入缓存,我们可以从缓存中取出一块值或将一块值复制到另一缓存区域。可以对像素阵列执行各种其他操作。一般情况下,术语光栅操作(raster operation)用于描述以某种方式处理一个像...
  • heyuchang666
  • heyuchang666
  • 2016-05-24 15:18:28
  • 981

OpenGL 笔记(一)输出图元 - 基本绘制方式

具体形式数值数据类型的后缀:i(整数)、s(短整数)、v(浮点数)、d(双精度浮点数);v(向量、矩阵形式)坐标屏幕显示窗口坐标 顶点数组 像素阵列函数 显示列表 diaplay list 窗口重定型...
  • birdy_
  • birdy_
  • 2017-08-26 08:26:14
  • 188

计算机图形学(二)输出图元_14_OpenGL像素阵列函数_2_像素图函数

将用彩色阵列定义的图案应用到一块帧缓存的像素位置。其中的width和height也分别给出像素位图的列数和行数(阵列pixMap )。参数dataFormat用一个OpenGL常量赋值,指出如何为阵列...
  • heyuchang666
  • heyuchang666
  • 2016-05-24 15:10:56
  • 1058

d3d坐标系与绘制基本图元

坐标系与基本图元(5) 使用索引缓冲区绘制图形 当绘制一个比较复杂的图形时,需要使用许多相互邻接的三角形。如果为每个三角形准备三个顶点数据,显然有许多数据是重复的,这样会浪费大量的内存和系统带宽。为...
  • linuxheik
  • linuxheik
  • 2017-01-06 15:57:57
  • 616
    个人资料
    持之以恒
    等级:
    访问量: 62万+
    积分: 1万+
    排名: 1978