第二章 状态管理和绘制几何物体 总结

目标 1. 清除窗口

  2.强制完成所有尚未执行的绘图操作

  3.在2d或3d空间绘制图元

  4.打开、关闭、查询状态

  5.控制图元显示

  6.在实心物体表面适当位置指定法线向量

  7.用顶点数组和缓冲区对象存储和访问几何数据。

  8.同时保存和恢复几个状态变量。

1.1 3种基本操作:清除窗口、绘制几何图形、绘制光栅对象。

2. 绘图工具箱:

  2.1 清除RGBA模式的窗口


glClearColor(R, G, B, A);    //将当前清除颜色设置成为一个状态变量
glClearDepth(1.0); //指定深度缓冲区中每个像素要设置的值
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);  // 表示要清除的缓冲区为颜色缓冲区和深度缓冲区

  2.2 指定颜色

glColor3f(R,G,B);

  2.3 强制完成绘图操作

void glFlush(void);
void glFinish(void);

  2.4 坐标系统工具箱

  当窗口发生改变的时候,会发送一个时间作为通知。在glutReshapeFunc()中注册的那个函数会被调用。并且必须注册一个回调函数完成下面任务:

  1)重新建立一个矩形区域,把它作为新的渲染画布。

  2)定义一个用于绘制物体的坐标系统。


//一个2d的glutReshapeFunc(reshape)回调函数
void reshape(int w, int h)
{
glViewport(0, 0, (GLsizei)w, (GLsizei) h);//调整用于绘图的像素矩形,使它占据整个窗口
glMatrixMode(GL_PROJECTION);        //接下来的三行代码表示让坐标系的左下角为原点(0,0)
glLoadIdentity();
gluOrtho2D(0.0, (GLdouble)w, 0.0, (GLdouble)h);
}

3 描述图元:点、直线、多边形

  3.1 矩形:

    void glRect{sifd}(x1, y1, x2, y2);

  3.2 指定顶点:

    void glVertex[234]{sifd}();   //注意只有在glBegin 和glEnd之间时才有效

    void glVertex[234]{sifd}v();

  3.3 几何图元:

    将一组顶点放在glBegin 和glEnd之间, 传递给glBegin的参数决定了利用这些顶点所构成的几何图元的类型;

    有GL_POINT\GL_LINES\GL_LINE_STRIP\GL_LINE_LOOP\GL_TRIANGLES\GL_TRIANGLES_STRIP\GL_TRIANGLE_FAN\GL_QUADS\GL_QUAD_STRIP\GL_POLYGON


glBegin(GL_POLYGON);
glVertex2f(0, 0);
glVertex2f(0, 3);
glVertex2f(3, 4);
glEnd();

    在glBegin和glEnd之间还可以用另外的一些函数来指定顶点的额外的属性数据, 例如:颜色glColor*();
法线向量glNormal*(); 纹理坐标glTexCoord*();等

4. 基本状态管理

  物体在渲染的时候可能会用到光照、纹理、隐藏表面消除、雾或者其他的状态

  这都是由函数 void glEnable(); 和 void glDisalbe();来控制 , 例如有GL_BLEND,
GL_DEPTH_TEST, GL_FOG, GL_LINE_STIPPE, GL_LIGHTING等。

   查询GLboolean glIsEnable(GLenum capability); 它返回GL_TRUE\GL_FALSE,
 还可以查询其他类型的。

5. 显示点、直线和多边形

  5.1 点

    void glPointSize();

  5.2 直线

    线宽: void glLineWidth(GLfloat width);

    点画线: void glLineStipple(GLint factor, GLushort pattern) ;
必须掉用glEnable(GL_LINE_STIPPLE)来启用点画线功能。

  5.3 多边形细节

    点、轮廓、实心:void glPolygonMode(GLenum face, GLenum mode);
 参数face可以是GL_FRONT_AND_BACK, GL_FRONT, GL_BACK. 参数mode可以是GL_POINT,
GL_LINE,GL_FILL

   反转和剔除多边形表面:void glFrontFace(GLenum mode), mode表示哪面为正面 GL_CCW表示逆时针方向为正面,
GL_CW表示顺时针方向为正面。

   剔除:glEnable(GL_CULL_FACE); void glCullFace(GLenum mode);

   点画多边形:glEnable(GL_POLYGON_STIPPLE); void glPolygonStipple();

 5.4 法线

    void glNormal*()

  5.5 标记多边形的边界边

    void glEdgeFlag(GL_TRUE) 表示其后的顶点为边界边的起点。

6. 顶点数组 

  使用顶点数组对几何图形进行渲染需要三个步骤:

  1)激活顶点数组:顶点坐标(数组)、表面法线、RGBA颜色,辅助颜色、颜色索引、雾坐标、纹理坐标、多边形边界标志

    void glEnableClientState(GLenum array);//GL_VERTEX_ARRAY, etc.

    void glDisableClientState();

  2)把数据放入数组中。

    void glVertexPointer(GLint size, GLenum type, GLsizei stride, const
GLvoid*
pointer);//size是每个顶点的坐标数量2/3/4,stride是连续顶点之间的字节偏移量。type为GL_INT等,pointer是第一个顶点的内存位置

    void glColorPointer()\void
glSecondaryColorPointer\glIndexPointer\glNormalPointer\glFogCoordPointer\glTexCoordPointer\glEdgeFlagPointer


static GLint vertics[] = {
25, 25,
100, 325,
175,25
}

static GLfloat colors[] = {
1.0, 0.2, 0.2,
0.2, 0.2, 1.0,
0.8, 1.0, 0.2
}

glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);

glColorPointer(3, GL_FLOAT, 0, colors);
glVertexPointer(2, GL_INT, 0, vertices);

 3)用这些数据绘制几何图形:解引用和渲染。

  解引用:客户端的数组中数据被提取发送到服务器,然后发送到图形处理管线进行渲染。

  a. void glArrayElement(GLint ith); 获取当前已启用数组(可以是多个)的第ith个顶点数据。


glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_VERTEX_ARRYA);
glColorPointer(3, GL_FLOAT, 0, colors);
glVertexPointer(2, GL_INT, 0, vertices);

glBegin(GL_TRIANGLES)
glArrayElement(2);
glArrayElement(3);
glArrayElement(5);
glEnd();

  b. void glDrawElements(GLenum mode, GLsizei count, GLenum type, const
GLvoid *indices);   //
mode表示要创建那种图元GL_POLYGON/GL_LINE_LOOP/GL_LINES/GL_POINTS,
count表示解引用数组元素的个数,type表示类型为GL_UNSIGNED_BYTE等, indices表示元素的内存索引位置。

第二章 状态管理和绘制几何物体 总结,码迷,mamicode.com

时间: 2024-10-05 02:49:36

第二章 状态管理和绘制几何物体 总结的相关文章

HttpClient4.3教程 第二章 连接管理

2.1.持久连接 两个主机建立连接的过程是很复杂的一个过程,涉及到多个数据包的交换,并且也很耗时间.Http连接需要的三次握手开销很大,这一开销对于比较小的http消息来说更大.但是如果我们直接使用已经建立好的http连接,这样花费就比较小,吞吐率更大. HTTP/1.1默认就支持Http连接复用.兼容HTTP/1.0的终端也可以通过声明来保持连接,实现连接复用.HTTP代理也可以在一定时间内保持连接不释放,方便后续向这个主机发送http请求.这种保持连接不释放的情况实际上是建立的持久连接.Ht

操作系统——第二章 进程管理

二.进程管理 2.1进程与线程 2.1.1进程的基本概念 PID (ProcessID) 2.1.1进程的概念 多道并发执行可能会发生的问题: 不能让程序粗野的执行,我们必须给他们引入一些约束: 进程包括什么: 进程控制块是一种数据结构,在Linux中是一个结构体   (答案就是上面的那张图) 挂起状态 (Linux代码) 2.1.6线程 设计之初进程是独立的,进程间不允许用相同的地址空间,必须得开辟一块新的存储空间,然后来取,线程的设计解决了这种问题. 比如还是播放器问题: 单进程的话,读完了

FreeRTOS官方翻译文档——第二章 队列管理

2.1 概览基于 FreeRTOS 的应用程序由一组独立的任务构成--每个任务都是具有独立权限的小程序.这些独立的任务之间很可能会通过相互通信以提供有用的系统功能.FreeRTOS 中所有的通信与同步机制都是基于队列实现的. 2.2队列的特性数据存储队列可以保存有限个具有确定长度的数据单元.队列可以保存的最大单元数目被称为队列的"深度".在队列创建时需要设定其深度和每个单元的大小.通常情况下,队列被作为 FIFO(先进先出)使用,即数据由队列尾写入,从队列首读出.当然,由队列首写入也是

第二章_session管理

2.1 URL重写 URL重写是Session追踪技术.须要将一个或多个token做为一个查询字符串加入到一个URL中. Token的格式通常是键=值. Url?key-1=value-1&key-2=value-2...&key-n=value-n 2.2 隐藏域 利用隐藏域来保持状态,与採用网址重写技术类似.但它不是将值加入到URL后面,而是将他们放在HTML表单的隐藏域中.当用户提交表单时,隐藏域的值也传送到server.仅仅有当页面包括表单.或者能够在页面中加入表单时,才适合使用隐

操作系统概论 第二章

第二章 进程管理 输入一批数据 处理数据 打印处理结果 程序的顺序执行特点 顺序性 封闭性 可再现性 程序的并行执行 间断性 失去封闭性 不可再现性 程序并发执行 同一个程序在不同数据集合上的执行 不同的程序在不同数据集合上的执行 程序 具有独立功能的一组指令的集合 进程 允许并发执行的程序在某个数据集合上的运行过程 进程是由正文段 用户数据段及进程控制块共同组成的执行环境 正文段 存放被执行的机器指令 用户数据段 存放用户数据 进程控制块 存放进程的运行环境 进程 1. 并发性 并发性是进程和

零基础HTML5游戏制作教程 第2章 简单图形的绘制

第二章 简单图形的绘制 HTML5支持使用Canvas和SVG等方式在网页直接绘制图形.其中SVG适合用来绘制高质量的矢量图形,不适合用来做游戏,所以我们做游戏一般使用Canvas. 由于本教程以简单为原则,所以在初学阶段请不要把注意力分散到美工.画质等细节,我们只需要掌握矩形.多边形.圆形等简单图形的绘制,并对这些图形编程,使之具有一定的运动能力和游戏效果. (如果你偷懒,你甚至可以跳过本章中多边形和圆形的绘制,只学矩形,然后直接去看下一章.) 一,矩形的绘制 命令的格式是context.fi

Java 线程第三版 第一章Thread导论、 第二章Thread的创建与管理读书笔记

第一章 Thread导论 为何要用Thread ? 非阻塞I/O I/O多路技术 轮询(polling) 信号 警告(Alarm)和定时器(Timer) 独立的任务(Task) 并行算法 第二章 Thread的创建与管理 一.什么是Thread ? Thread是所在主机执行的应用程序任务(task). 只有一个线程的例子: public class Factorial { public static void main(String[] args) { int n = 5; System.ou

Java 螺纹第三版 第一章Thread介绍、 第二章Thread创建和管理学习笔记

第一章 Thread导论 为何要用Thread ? 非堵塞I/O I/O多路技术 轮询(polling) 信号 警告(Alarm)和定时器(Timer) 独立的任务(Task) 并行算法 第二章 Thread的创建与管理 一.什么是Thread ? Thread是所在主机运行的应用程序任务(task). 仅仅有一个线程的样例: public class Factorial { public static void main(String[] args) { int n = 5; System.o

HttpClient第三章 HTTP状态管理

原始的HTTP被设置成无状态的面向请求响应的协议,它并没有为基于跨几个逻辑相关的请求/响应交换的有状态会话提供所需的功能.但是随着HTTP协议越来越流行并且被应用,越来越多的系统开始用它作为原本并不是它的作用的功能,例如,电子商务传输应用,这样一来,对于状态管理的支持成为一个必要的功能. 那时网景公司作为一个web客户端和服务器端软件的领导开发者在他们的一个基于特殊的说明的产品里实现了对HTTP状态管理的支持,后来,网景通过发布一个知指导说明书试图标准化这一机制.这些努力促成了通过RFC标准的正