[OpenGL][学习笔记]第2章状态管理和绘制几何物体

绘图工具箱

清除窗口

  在计算机中,保存图片的内存通常被计算机所绘制的前一幅图像所填充,因此在绘制新场景之前,一般需要把它清除为某种背景颜色。

  • glClearColor()函数和glClear()函数
    void glClearColor(GLclampf red,GLclampf green,GLclampf blue,GLclampf alpha);
    设置当前清除颜色、用于清除RGBA模式下的颜色缓冲区,red,green,blue和alpha值范围限定在[0,1]之内。默认的清除颜色是(0,0,0,0),黑色。
    void glClear(GLbitfield mask);
    用当前的缓冲区清除值清除指定的缓冲区。mask参数的值是下表值的位逻辑OR组合。
缓冲区名称说明
颜色缓冲区GL_COLOR_BUFFER_BIT存储了经过图形流水线一系列处理测试后最终生成的像素颜色值,也就是最终在显示屏上显示颜色的GPU显存区域。
深度缓冲区GL_DEPTH_BUFFER_BIT存储了每个像素的深度值。通过深度缓冲区的数值可以进行深度测试,确定像素的遮挡关系,提高渲染效率。
累积缓冲区GL_ACCUM_BUFFER_BIT将渲染到颜色缓冲区的值重复拷贝到累积缓冲区,每次可以用不同的方式与当前累积缓冲区的内容混合,完成后拷贝回颜色缓冲区,通过swapbuffers显示。
模板缓冲区GL_STENCIL_BUFFER_BIT像PS里的蒙版
通过设置每个像素位的值,确定该点像素是否被渲染。

  在发出命令清除多个缓冲区之前,如果想使用的并不是默认的RGBA值、深度值、累积值和模板索引值,就必须为每个缓冲区设置需要清除的值。除了glClearColor和glClearDepth以外还可以使用glClearIndex清除相应缓冲区的颜色索引、glClearAccum清除相应缓冲区的累积颜色、glClearStencil清除相应缓冲区的模板索引值。

OpenGL允许同时清除多个缓冲区,因为清除是一种相对较慢的操作,涉及窗口中的每个像素。有些图形硬件允许同时清除一组缓冲区,如果不支持同时清除多个,则硬件会线性地执行这些清除操作。
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

glClear(GL_COLOR_BUFFER_BIT);
glClear(GL_DEPTH_BUFFER_BIT);
两者等价,但是前者执行速度更快。

指定颜色

  一般而言,首先设置颜色或颜色方案然后再绘制物体,在这种颜色或颜色方案被修改之前,所有物体都用这种颜色或这种颜色方案进行绘制。函数:glColor3f();。

强制完成绘图操作

void glFlush(void);
  强制以前发出的OpenGL命令开始执行,因此保证它们能够在有限的时间内完成。
void glFinish(void);
  强制以前发出的OpenGL命令完成执行。在以前的命令完成执行之前,这个函数不会返回。

坐标系统工具

  在打开窗口、移动窗口或改变窗口大小的时候,窗口系统都会发送一个事件作为通知。如果使用的是GLUT,它会自动产生,并且在glutReshapeFunc()中注册的回调函数会被调用。回调函数会完成以下两个任务:

  1. 重新建立一个矩形区域,把它作为新的渲染画布
  2. 定义一个用于绘制物体的坐标系统

描述点、直线和多边形

OpenGL的点、直线、多边形


  用一组称为顶点的浮点数表示。

直线
  表示一段线段。任何构成连线系列的直线都是根据他们的端点(顶点)指定的。

多边形
  由线段构成的单闭合环,其中线段是由他们的端点位置的顶点指定的。
注:OpenGL多边形的各条边不能相交(即为简单多边形);OpenGL多边形必须是凸多边形,也就是不存在内陷的部分(在多边形内部任意取两个点,如果连接这两个点的线段都在这个多边形内部,则这个多边形就是凸多边形)。

矩形
  OpenGL提供了填充矩形图元函数glRect*()。
  void glRect{sifd}(TYPE x1.TYPE y1,TYPE x2.TYPE y2);
  void glRext{sifd}v(const TYPE *v1,const TYPE *v2);
  绘制由角顶点(x1,y1)和(x2,y2)定义的矩形这个矩形位于z=0的平面上,并且它的边与x和y轴平行。第二个式子是该函数的向量形式,角顶点是由两个数组指针指定的,它们分别包含了一对(x,y)坐标值。

曲线和弯曲表面
  通过组合大量的短直线或小多边形来模拟曲线或弯曲表面。

指定顶点

  在OpenGL中,所有的几何物体最终都描述成一组有序的顶点。glVertex*()函数用于指定顶点。
  void glVertex[234]{sifd}(TYPE coords);
  void glVertex[234]{sifd}v(const TYPE* coords);
指定了一个用于描述几何物体的顶点。
[234]:提供2个坐标(x,y),或提供3个坐标(x,y,z),或提供4个坐标(x,y,z,w);
{sifd}:short,int,float,double;
例如:
glVertex3d(0.0,0.0,3.1415926535898);
glVertex4f(2.3,1.0,-2.2,2.0);

GLdouble dvect[3]={5.0,9.0,1992.0};
glVertex3dv(dvect);

OpenGL几何图元

  把一组顶点放在一对glBegin()和glEnd()之间,根据传递给glBegin()的参数,这些顶点能够构建不同形状的几何图元。
void glBegin(GLenum mode);
  标志着一个顶点数据列表的开始,描述了一个几何图元。mode参数指定了图元的类型

含义
GL_POINTS单个的点
GL_LINES一对顶点构成一条直线
GL_LINE_STRIP一系列相连的直线
GL_LINE_LOOP同上,但是第一个顶点和最后一个顶点会相连形成闭合循环
GL_TRIANGLES三个顶点构成三角形(v0v1v2/v3v4v5/v6v7v8/…)
GL_TRIANGLE_STRIP三角形的连接串 (v0v1v2/v2v1v3/v2v3v4/…)
GL_TRIANGLE_FAN连接成扇形的三角形 (v0v1v2/v0v2v3/v0v3v4/…)
GL_QUAD_STRIP四个顶点构成一个四边形
GL_POLYGON简单的凸多边形

void glEnd(void);
  标志着顶点数据列表的结束。

  除非被编译到一个显示列表中,否则所有的glVertex*()函数都应该出现在glBegin()和glEnd()之间,如果出现在其他地方就不会有任何效果。如果编译到了一个显示列表中,那这个显示列表应该出现在glBegin()和glEnd()之间。

基本状态管理

  物体在进行渲染时可能会使用光照、纹理、隐藏表面消除、雾以及其他影响物体外观的状态,为了打开或关闭这些状态,可以使用下面这两个简单的函数:
void glEnable(GLenum capability);
void glDisable(GLenum capability);

可以向这两个函数传递超过60个的枚举值作为参数,比如
GL_BLEND(用于控制RGBA颜色的混合)
GL_DEPTH_TEST(用于控制深度比较,并对深度缓冲区进行更新)
GL_FOG(控制雾)
GL_LINE_STRIPPLE(直线的点画模式)
GL_LIGHTING(光照)

GLboolean glIsEnabled(GLenum capability);
查询并返回被查询状态是否启用

显示点、直线和多边形

点的细节

void glPointSize(GLfloat size);
设置被渲染的点的宽度,以像素为单位。size必须大于0.0,默认为1.0。

关于“抗锯齿”
如果抗锯齿功能禁用,那么带小数的宽度值将四舍五入为整型值,在屏幕上绘制的是对齐的正方形像素区域。
如果抗锯齿功能或者多重采样启用,那么非整形的宽度值不会被四舍五入,且位于边界的像素所使用的颜色强度会相对变小,使得边缘更加光滑。

直线的细节

在OpenGL中,可以指定不同宽度的直线,也可以指定不同点画模式的直线,比如点线(doottedline)、用点和短直线交替绘制而成的段线(dash line)等。
** void glLineWidth(GLfloat width);**
以像素为单位设置宽度,用于直线的渲染。

默认情况下直线宽度为1个像素,所以在低分辨率的屏幕上看起来会显得更粗一点。
** void glLineStripple(GLint factor,GLushort pattern);
pattern是一个由1或0组成的16位序列。从低位开始按照像素进行处理,对应位是1就绘制该像素,不是1就不绘制该像素。
factor表示重复因子,它与1和0的连续子序列相乘。

多边形的细节

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值