状态量管理和绘制几何物体---1

绘图补救工具箱:

1.清空窗口: 在计算机上,载有图画的内存常常被最后画出的那幅图占据着,所以在画新的图之前,我们需要先用某种背景颜色清空这块内存。

2、像素颜色在位平面的保存方式:

                a、以像素的红色、绿色、蓝色和alpha 值来保存。

                 b、保存在一个颜色查询表的单一索引值中。

     //  指定清空的背景颜色
    glClearColor(1, 0, 0, 0);
    //  清空放置颜色的那块缓存
    glClear(GL_COLOR_BUFFER_BIT);

glClear 可以清空四种缓存:

GL_COLOR_BUFFER_BIT  -----颜色缓存  ---------------------------glClearColor

GL_DEPTH_BUFFER_BIT  -------深度缓存---------------------------glClearDepth

GL_ACCUM_BUFFER_BIT --------累积缓存--------------------------glClearAccum

GL_STENCIL_BUFFER_BIT---------模板缓存------------------------glClearStencil
我们看到上面清空颜色缓存之前,指定了某种背景颜色,其他的也是:上面对应的函数就是用来指定的。

还有一个glClearIndex 是用来清空对应缓存的颜色索引。如果你要清空多个缓存可以这样用:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_ACCUM_BUFFER_BIT);

 

指定颜色:

     在OPENGL中,对所要绘制物体的形状描述与对其颜色描述是相互独立的。

     设置颜色函数: glColor3f();

    

    glColor3f(1.0, 1.0, 1.0); // 白色
    glColor3f(1.0, 0, 0);     // 红色
    glColor3f(0.0, 1, 0);     // 绿色
    glColor3f(0, 0, 1.0);     // 蓝色
    glColor3f(1.0, 1.0, 0);   // 黄色
    glColor3f(1.0, 0, 1.0);   // 洋红色
    glColor3f(0, 1.0, 1.0);   // 蓝绿色
    glColor3f(0, 0, 0);       // 黑色

强制完成绘图:

    因为现代的图形系统可以看成一条装配线。cpu 发出绘图命令, 由其他硬件来实现几何变换, 先裁剪, 然后进行纹理或阴影操作,最后将数值写入位平面。 在高端的体系结构中, 每一个操作由不同的硬件来完成。这样CPU没必要等待每一个绘图命令完成以后再发送下一条命令。

2. 如果客户机上运行主程序, 而程序员通过网络上另外的工作站或者终端观看绘图结果。因为网络有严重的超前,通过网络每次只发送一条命令,其低效程度是可怕的。因为客户总是将命令聚集在一个单一的网络包中, 然而可能绘图命令无法填满一个网络数据包, 这样服务器端就永远看不到完整的图画了。

  OPENGL提供glFlush() 来强迫用户发送网络数据包,而不管其是否填满。 而在非网络环境下, 有以下应用场景:

1. 在系统内存中用软件渲染建立图像, 并且不想恒定的刷新屏幕。

2。 用于那些由于聚集了渲染函数而扩大了启动开销的应用程序。。

glFlush() 该函数强制前面发出的OPENGL命令开始执行, 少数一些命令: 如双缓存模式下的交换缓存命令, 在调用之前, 会自动的将未完成的命令送入网络中。

 

坐标系统修补箱:

   当窗口变化的时候: 执行初始化打开窗口,移动窗口, 改变窗口尺寸等等。 窗口系统将统一发送一个消息给程序员。如果使用GLUT, 上述通知自动完成, 并且会调用注册给glutReshapeFunc()的函数。 这个函数完成以下操作:

   1.   重新建立矩形区域, 该区域是一个新的渲染场景。

   2. 定义绘制物体所处的坐标系。

 

如下这段代码:

// width, height 内部传给回调函数的两个参数:以像素为单位新的窗口的高度和宽度
void Reshape(int width, int height) 
{
    glViewport(0, 0, width, height);  //调整像素矩形来绘制整个新的窗口。

    //  调整坐标系,使得左下角的位置是(0,0), 右上角为(width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0, width, 0, height); 
}


点、线 和多边形的描述:

所有的几何图元最终都以顶点坐标来描述。

 

在OPENGL应用中, 浮点数的计算的精度都是有限的, 存在舍入误差,所以会受到影响。

另外几何图元都受到光栅图形显示的限制。

一个点是由一系列定义为浮点数来表示的, 内部计算中总认为顶点是三维的。由用户定义的二维顶点,其默认的Z坐标为0.

OPENGL 是在三维投影几何学中的齐次坐标下工作的, 因此对于内部计算来讲, 所以的顶点都是由四个浮点坐标l(x, y, z, w)来表示的。

若  w != 0,这些坐标对应与欧式几何中的三维空间点(x/w, y/w, z/w); , 如果w没有指定, 默认值为1.0; 然而, OPENGL很少定义w坐标。

线: 指线段。

多边形: 是指由线段组成的单个闭合回路围成的区域, 这些线段由其端点处的顶点指定。 多边形常常通过填充其内部的像素来画出。

因为多边形比较复杂, 所以OPENGL对基本多边形图元的组成做了一些强制的限定:

      1.  OPENGL多边形的边不能相交。

       2. OPENGL多边形必须是凸的。

  之所以会对其做限制, 是因为可以更快的渲染。而现实中,许多表面由非简单多边形,非凸多边形或者有洞的多边形组成的, 所有这些都可以有简单的凸多边形组合而成。

由于OPENGL顶点一般是三维的, 这些组成特定多边形边界的点并不位于空间同一个平面内。

 

矩形:

因为普遍运用, 所以专门有专业的函数: glRect*()。此函数由对角顶点来定义矩形。

 

曲线和曲面:

所有光滑的曲线和曲面都可以由短线段和小多边形区域以任意的精度进行逼近。 例如将线段和平面多边形分割成比屏幕上的一个像素还小的程度, 那么这种近似是非常有效的。

 

定义顶点:

在OPENGL中, 所有的几何物体最终都要描述成一个顶点的有序几何。可以用glVertex*函数来定义一个顶点。

该函数应该在glBegin() 和 glEnd()之间进行。这么用:

void DrawSquare()
{
    glBegin(GL_POLYGON);
    glVertex2f(-1.0f, -1.0f);
    glVertex2f(-1.0f, 1.0f);
    glVertex2f(1.0f, 1.0f);
    glVertex2f(1.0f, -1.0f);
    glEnd();
}

OPENGL几何绘图图元:

在上面我们看到glBegin里面 有一个参数, 还有其他的参数:

GL_POINTS    // 独立的点。
    GL_LINES     // 一对顶点表示一条线段
    GL_LINE_STRIP // 一系列相连的线段
    GL_LINE_LOOP  // 同上,另外在开始和结束顶点之间增加一条线段,使其闭合。
    GL_TRIANGLES // 表示三角形顶点的三元组
    GL_QUADS    //  表示四边形顶点的四元组。
    GL_POLYGON   // 简单的、凸多边形边界。

上面只列了一些, 具体的大家可以去google一下。

使用glBegin() and glEnd()的限制:

顶点所载入的是其坐标, 这些坐标值由函数 glVertex*()指定, 当然也可以为每一个顶点指定附加的顶点数据---颜色、法线向量、纹理坐标或者这些数据的任意组合。

glColor*() ----当前颜色

glIndex*() ----- 当前颜色索引

glNormal*()-------法线向量坐标

glTexCoord*() ------设置纹理坐标

glMultiTexCoord*ARB() -----为多纹理映射设置纹理坐标

glEdgeFlag*() ------------ 控制边的绘制

glMaterial*()  -----------设置材料属性

glArrayElement() ----- 抽取顶点数组数据

glEvalCoord*() 、glEvalPoint*()  -----生成坐标

glCallList()、GLCallLists()  =======执行显示列表

其他任何OPENGL函数出现在glBegin and glEnd()函数之间都是无效的, 将产生错误。

 

基本状态管理:

基本状态:如对物体的渲染可以用光照、纹理、隐藏面的消除、雾和其他影响物体的现实状态。

这些状态的开关可以用下面两个函数来控制:

void glEnable(GLenum cap);   //打开

void glDisable(GLenum cap);  //关闭

检查某个状态变量的是打开的还是关闭的: GLBoolean glIsEnabled(GLenum cap);

返回: GL_TRUE 或者 GL_FALSE。

然而OPENGL函数为更复杂的状态变量设置了值。例如: glColor3f()设置了三个值, 他们是GL_CURRENT_COLOR的一部分,

 可以用glGetFloatv(GLenum pName, GLfloat* params); 来获得。当然还有其他的很多。 


 



 

 

    

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值