初学opengl

来源:互联网 发布:淘宝复制别人店铺装修 编辑:程序博客网 时间:2024/06/05 04:46

1、以下函数用于设置每个缓冲区的清除值,清除命令设置的值一直保持有效,直到再次用同一个命令对他们进行修改

  • void  glclearColor(GLclampf  red, GLclampf green, GLclampf blue, GLcalmpf alpha) ;

指定RGBA(Red、Green、Blue、Alpha(alpha并不直接显示,它通常用于控制颜色的混合。表示不透明度,1.0表示完全不透明,0.0表示完全透明)的色彩空间)模式下的颜色缓冲区的当前清除值。GLclampf为在0和1之间的32为浮点型小数,默认值都为0。如glClearColor(0.0,0.0,0.0,0.0)表示清除值为黑色。

  • void glClearIndex(GLfloat index);
颜色索引模式下的颜色缓冲区,index默认值为0
  • void glClearDepth(GLclampd depth);
深度缓冲区,depth默认值为1.0。指定了深度缓冲区中每个像素需要设置的值。
  • void glClearStencil(GLint s);
模板缓冲区,s默认值为0
  • void glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);

累积缓冲区,GLfloat默认值都为0


2、选择了清除值,并准备清除缓冲区时,可以使用glClear()函数即glClear()函数完成清除任务。

  • void glclear(GLbitfield mask);

GLbitfield:可以使用|运算符组合不同的缓冲标志位,表明需要清除的缓冲。

mask标志位有如下:<1>GL_COLOR_BUFFER_BIT 用于清除RGBA颜色缓冲区或颜色索引缓冲区(取决于系统使用的是那种颜色模式)

  <2>GL_DEPTH_BUFFER_BIT 深度缓冲

  <3>GL_ACCUM_BUFFER_BIT  累积缓冲

  <4>GL_STENCIL_BUFFER_BIT 模板缓冲


3、RGBA模式与颜色索引模式的区别

  • RGBA模式

在RGBA模式中,硬件分配一定数量的位面()给R、G、B和A成分(每个成分的数量不一定一样)如图4-2所示。R、G、B的值通常以整型存储,而不是浮点数,并且它们被扩展成可以方便存储和获取的位数。例如,在一个R成分有8位的系统中,从0到255的成分就可以存储,这样,0,1,2,……,255就对应R的值0/255 = 0.0, 1/255, 2/255, ..., 255/255 = 1.0。无论位面的数量是多少,0.0总是最小的亮度值,1.0总是表示最大的亮度值。



图1-1

  •     颜色索引模式

   在颜色索引模式下,OpenGL使用一个颜色表(或查找表),就像用一个调色板来调出场景需要的各种颜色。画家的调色板提供了很多小格子用于调色;类似的,计算机的颜色表提供很多索引,供RGB值进行混合,如图1-2所示。

图1-2


4、glcolor()函数确定了绘制物体所使用的颜色,需要注意的是,如果在glBegin()与glEnd()函数之间多次连续调用颜色函数,那么,只会显示出最后一次的颜色。glColor3b,glColor4b glColor3s glColor4s,glColor3i,glColor4i需要3个或4个无符号字节,或长或短的整数作为参数。当v附加到该名称,颜色命令可以采取这种数值的数组的指针。

例如:glColor3f(1.0,0.0,0.0);


  GLfloat color_array[] = {1.0,0.0,0.0};

  glColor3fv(color_array);


glColor3f(0.0, 0.0, 0.0);  --> 黑色  

glColor3f(1.0, 0.0, 0.0);  --> 红色  

glColor3f(0.0, 1.0, 0.0);  --> 绿色  

glColor3f(0.0, 0.0, 1.0);  --> 蓝色  

glColor3f(1.0, 1.0, 0.0);  --> 黄色  

glColor3f(1.0, 0.0, 1.0);  --> 品红色  

glColor3f(0.0, 1.0, 1.0);  --> 青色  

glColor3f(1.0, 1.0, 1.0);  --> 白色  


5、opengl函数可以在它们的参数中接受多达8种不同的数据类型,类型定义如表1-1。

OpenGL数据类型

内部表示法

定义为C类型

C字面值后缀

GLbyte

8位整数

signed char

b

GLshort

16位整数

short

s

GLintGLsizei

32位整数

int或long

i

GLfloatGLclampf

32位浮点数

float

f

GLdoubleGLclampd

64位浮点数

double

d

GLubyteGLboolean

8位无符号整数

unsigned char

ub

GLushort

16位无符号整数

unsigned short

us

GLuintGLenumGLbitfield

32位无符号整数

unsigned long

ui

表1-1

6、void glOrtho(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top,GLdouble near,GLdouble far);

实际上这个函数的操作是创建一个正射投影矩阵,并且用这个矩阵乘以当前矩阵。
这个函数描述了一个平行修剪空间。这种投影意味着离观察者较远的对象看上去不会变小(与透视投影相反)。在3D笛卡尔坐标中想象这个修剪空间,左边和右边是最小和最大的X值,上边和下边是最小和最大的Y值,近处和远处是最小和最大的Z值。 正射投影,又叫平行投影如图1-3。这种投影的视景体是一个矩形的平行管道,也就是一个长方体。正射投影的最大一个特点是无论物体距离相机多远,投影后的物体大小尺寸不变。这种投影通常用在建筑蓝图绘制和计算机辅助设计等方面,这些行业要求投影后的物体尺寸及相互间的角度不变,以便施工或制造时物体比例大小正确。






图1-3


7、glFlush()函数用于强制刷新缓冲,保证绘图命令将被执行,而不是存储在缓冲区中等待其他的OpenGL命令。OpenGL是用一条渲染管线线性处理命令的,它的绘图机制是:先用 OpenGL 的绘图上下文 Rendering Context (简称为 RC )把图画好,再把所绘结果通过 SwapBuffer() 函数传给 Window 的 绘图上下文 Device Context (简记为 DC)。要注意的是,程序运行过程中,可以有多个 DC,但只能有一个 RC。因此当一个 DC 画完图后,要立即释放 RC,以便其它的 DC 也使用。

  • glFlush应用场合:

     <1>在系统内存中创建图像的软件渲染程序,并且并不想经常更新屏幕。

     <2>在那些收集成批的渲染命令以及降低启动开销的opengl实现中。网络传输就属于这种情况。

  • glFlush()与glFinish()区别:

(1)gLFlush()作用是将缓冲区中的指令(无论是否为满)立刻送给图形硬件执行,发送完立即返回;

(2)glFinish()作用也是将缓冲区中的指令(无论是否为满)立刻送给图形硬件执行,但是要等待图形硬件执行完这些指令才返回。

(3)如果需要执行一些同步性的任务,就可能要用到glFinish()。

如果调用glFinish,通常会带来性能上的损失。因为它会是的GPU和CPU之间的并行性丧失


8、函数原型:

      glVertex4iglVertex4sglVertex2dvglVertex2fvglVertex2ivglVertex2svglVertex3dvglVertex3fvglVertex3iv,glVertex3svglVertex4dvglVertex4fvglVertex4ivglVertex4sv

      例子:

      glVertex3f(GLfloat x, GLfloat y, GLfloat z);

函数说明:

      glVertex函数用在glBegin和glEnd之间,除此以外没有意义。用来指定点、线和多边形的顶点。当调用glVertex时,可以为该顶点指定颜色、法线量和纹理坐标。当只指定x,y时,z缺省为0.0,w缺省为1.0;当只指定x、y和z时,w缺省为1.0

0 0
原创粉丝点击