opengl学习笔记——状态管理和绘制几何物体

1、绘图工具箱

<1>清除窗口
glClearColor(0.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT);

<2>指定颜色
glColor3f(1.0,0.0,0.0);

<3>强制完成绘图操作
glFlush();

<4>坐标系统工具箱
无论是在打开窗口的时候,还是在以后移动窗口或改变窗口大小的时候,窗口系统都会发送一个事件作为通知。如果使用GLUT,它会自动产生通知,并且在glutReshapeFunc()中注册的那个回调函数会被调用。
回调函数完成下列任务:
  • 重新定义一个矩形区域,把它作为新的渲染画布
  • 定义一个用于绘制物体的坐标系统
例如:GLUT的内核向这个函数传递2个参数:width和height,它们表示这个新的窗口的宽度和高度(以像素为单位)
void reshape(int w,int h)
{
glViewport(0,0,(GLsizei) w,(GLsizei) h); //调整用于绘图的像素矩阵,使它占据整个新窗口。
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0,(GLdouble) w,0.0,(GLdouble) h);
}

2、描述点、直线和多边形

所有的几何图元都是根据它们的顶点(vertex)来描述的。在任何opengl实现中,浮点计算的精度都是有限的,存在四舍五入的误差。opengl是根据三维投影几何的齐次坐标系进行操作的。在内部的计算中,所有的顶点都是用4个浮点坐标值表示的(x,y,z,w)。如果w不等于0,这个坐标值就对应于欧几里得三维点(x/w,y/w,z/w)。如果为指定w坐标,它就默认为1.0

opengl特别提供了填充矩阵图元函数glRect*()。

<1>指定顶点
void glVertex[234]{sifd}(TYPE coords);
void glVertex[234]{sifd}v(const TYPE* coords);
glVertex*()函数只有当它位于glBegin()和glEnd()之间时才有效。

<2>opengl几何图元

  • void glBegin(GLenum mode);标志着一个顶点数据列表的开始,它描述了一个几何图元。mode参数指定了图元的类型,它可以是表3-1列出的任何一个值。
  • void glEnd(void);标志着一个顶点数据列表的结束。


表3-1几何图元的名称和含义





表3-2 glBegin()和glEnd()之间的合法函数

3、基本状态管理

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

  glEnable()用于启用功能,glDisable()用于关闭。有60多个枚举值可用作glEnalbe()或glDisable()的参数,其中包括GL_BLEND、GL_DEPTH_TEST等。

  • GLboolean glIsEnabled(GLenum capability);
        检查状态当前处于启动还是禁用状态。
        该函数根据被查询的功能是否被启动,返回GL_TRUE或GL_FALSE。
  上述状态只有两种,开和关。大多数OpenGL函数为更复杂的状态变量设置值。例如,函数glColor3f()设置三个值,它们是状态GL_CURRENT_COLOR的组成部分。


可以使用的查询函数共有5个,可以查询许多状态的当前值如表3-3:


void glGetBooleanv(GLenum pname, GLboolean *params);
void glGetIntegerv(GLenum pname, GLint *params);

void glGetFloastv(GLenum pname, GLfloat *params);
void glGetDoublev(GLenum pname, GLdouble *params);

void glGetPointerv(GLenum pname, GLvoid **params);


  表3-3

这些函数分别获得布尔值、整型、浮点型、双精度型和指针型变量的值。pname参数是一个符号常量,表示需要返回的状态变量。params是一个数组指针,指向包含返回数据的位置


4、显示点、直线和多边形

  默认情况下,点在屏幕上被绘制为1个像素;直线被绘制为宽度为1个像素的实线,多边形被绘制成实心(solid)填充的形式。


<1>点的细节
void glPointSize(GLfloat size);
该函数设置被渲染点的宽度(单位为像素),size必须大于0.0,默认值为1.0。
对于各种大小的点,根据是否启用了抗锯齿功能,将在屏幕上绘制一些列像素。反走样是一种使点和直线更平滑的技术。如果不使用(默认设置),用小数表示的宽度将舍入为整数,然后绘制一个与屏幕平行的方形像素区域。因此,如果宽度为1.0,则方形区域为1*1像素;如果宽度为2.0,则方形区域为2*2像素,依次类推。
如果启动了抗锯齿或多重采样,将绘制一个圆形像素区域,并将边界上的像素画的暗些,使边缘显得较为光滑。在这种模式下,对非整数宽度进行舍入。glGetFloatv(),查看支持点的最大和最小尺寸。参数为GL_ALIASED_POINT_RANGE(未进行抗锯齿处理)或GL_SMOOTH_POINT_SIZE_RANGE(进行了抗锯齿处理)

例如:glPointSize(2.37);并且返回的粒度值为0.1,那么这个点的大小将四舍五入为2.4


<2>直线的细节
 在OpenGL中,可以指定线宽和各种点画方式:点线(dottedline)、短划线(dashed)以及交替使用点和短划线而成的段线(dash line)等。

  • void glLineWidth(GLfloat width);该函数以像素为单位设置线宽;参数width的值必须大于0.0,默认为1.0。

  如果抗锯齿和多重采样被启用,渲染直线时将受影响。抗锯齿没有被启动时,如果宽度为1、2、3,将绘制宽度分别为1个、2个和3个像素的直线;抗锯齿被启动时,可支持非整数线宽,同时边缘像素通常暗些。同点尺寸一样,OpenGL实现可能将非抗锯齿直线的最大宽度限制为最大的抗锯齿线宽。


  • void glLineStipple(GLint factor,GLushort pattern); //pattern 参数是一个由1或0组成的16位序列,它们根据需要进行重复,对一条特定的直线进行点画处理。从这个模式的低位开始,一个像素一个像素地进行处理。如果模型中对应的位是1,就绘制这个像素,否则就不绘制。factor表示重复因子,它与0和1的连续子序列相乘。例如:

        glLineStipple(1,0x3F07);//0x3F07(二进制形式为0011111100000111),它所画出来的直线是这样的:先是连续绘制3个像素,然后连续5个像素留空,然后再连续绘制6个像素。最后2个像素留空。如果factor是2,那么这个模式被扩展为:绘制6个像素,留空10个像素、绘制12个像素,最后留空4个像素。

      点画线可以和宽直线一起使用,以产生宽点画线。

  • glEnable(GL_LINE_STIPPLE);
为了创建点画线(电线或段线),可以使用glLineStipple()函数定义点画模式,然后用glEnable()函数启用直线点画功能。


  3.多边行的细节

 一般情况下,多边形是按填充模式绘制的,边界之内的像素均被绘制。但是,也可以把它们画成轮廓形式,甚至只绘制它们的顶点。填充多边形可以是实心填充,也可以用某种模式进行点画填充。相邻的填充多边形如果共享一条边或一个顶点,组成这条边或这个顶点的像素只绘制一次,它们只包含在其中一个多边形中。这样,部分透明的多边形的边不会绘制两次,它们的边缘看上去不会更暗。为了对填充多边形进行抗锯齿处理,强烈推荐使用多重采样。

  • 点、轮廓或实心形式的多边形

     多边形具有正面和背面两个面。取决于哪一面朝向观察者,多边形可能会被渲染成不同的样子。这样,就可以获得实心物体正反两面截然不同的剖视图。在默认情况下,多边形的正面和背面是按照相同的方式绘制的。为了更改这个行为,或者只绘制它的轮廓或顶点,可使用glPloygonMode(GLenum face, GLenum mode)函数。

       void glPolygonMode(GLenum face,GLenum mode);控制一个多边形的正面和背面的绘图模式。face参数可以是GL_FRONT_AND_BACK、GL_FRONT、GL_BACK。mode参数是GL_POINT、GL_LINE或GL_FILL,表示多边形应该被画成点、轮廓还是填充形式。在默认情况下,多边形的正面和背面都画成填充模式。


  例如,可以通过下面两个调用,把多边形的正面画成填充形式,把背面画成轮廓形式:
  glPolygonMode(GL_FRONT, GL_FILL);glPolygonMode(GL_BACK, GL_LINE);

  • 反转和剔除多边形表面
      按照约定,如果多边形的顶点以逆时针顺序出现在屏幕上,它便称为正面。可以根据方向一致的多边形构建任何合理实心表面。按照数学的术语,这种表面称为可定向簇。为了创建可定向的表面,可以使用全部是逆时针方向的多边形,也可以使用全部是顺时针方向的多边形,这正是可定向的数学定义。顶点的方向(顺时针或逆时针)又称为环绕。
      在一个完全闭合的表面(由方向一致的不透明多边形所组成)上,所有的背面多边形都是不可见的,因为它们总是被多边形的正面所遮挡。如果观察者位于这个表面的外侧,可以启用剔除功能,丢弃哪些被OpenGL认为是背面的多边形。类似的,如果观察者位于物体的内侧,只有背面的多边形才是可见的。告诉OpenGL丢弃哪些不可见的正面或背面多边形,可以使用glCullFace()函数。当然,在此之前必须调用glEnable()函数启动剔除功能。
  • 点画多边形
      在默认情况下,填充多边形是用实心模式绘制的。此外,它们还可以使用之中用32*32位的窗口对齐的点画模式。glPolygonStipple()函数用于指定多边形的点画模式;启用多边形点画功能;glEnalbe(GL_POLYGON_STIPPLE);用同一个参数调用glDisalbe()函数可以禁用多边形点画功能。
  • 标记多边形的边界边
      在默认情况下,所有的顶点都标记为边界边的起点,但是可以使用glEdgeFlag*()函数手工控制边界标志(edge flag)的设置。这个函数在glBegin()和glEnd()之间调用,它将影响在之后所制定的所有顶点,直到再次调用glEdgeFlag()函数。它只用作用于那些为多边形、三角形和四边形所指定的顶点,对那些为三角形带或四边行带所指定的顶点无效。
      void glEdgeFlag(GLboolean flag); void glEdgeFlagv(const GLboolean *flag);





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值