1、矩阵变换
1)void glTranslatef(float x,float y, float z);
定义:模型变换矩阵
参数:x ,y, z 变换的坐标(用世界坐标系来表示的);
2)voidgluLookAt(doubleeyex, double eyey, double eyez,double centerx, double centery, double centerz, double upx, double upy,double upz);
定义:观测变换矩阵
参数:Eyex ,eyey, eyez 观察坐标系的原点(用世界坐标系来表示的);
centerx, centery,centerz 指定了观察方向(z轴的反方向,用世界坐标系来表示的);
upx,upy,upz 指定了y轴的正方向的近似方向(用世界坐标系来表示的);
其它说明:
投影方向:观测点坐标到中心点坐标向量的相反方向
3)void glRotatef(float angle,float x, float y,float z);
定义:选择坐标轴。
参数:angle :选转的角度,正表示逆时针旋转,负表示顺时针旋转;
x,y,z,表示向量,决定选转的轴
3)void glOrtho(double left,double right, double bottom,double top, double zNear,double zFar);
定义:正交投影,正交投影是大小不变的投影。
参数:参数表示的是投影的空间
4)void glFrustum(double left,double right, double bottom,double top, double zNear,double zFar);
定义:透视投影,透视投影有近大远小的效果
参数:参数表示的是投影的空间
5)void gluPerspective(double fovy,double aspect, double zNear,double zFar);
定义:透视投影,透视投影有近大远小的效果
参数:near和 far决定了投影参考点与裁剪窗口的距离,
fovy决定了裁剪窗口的高度
aspect 确定了裁剪窗口的长宽比例。
其它说明:
fovy越大,裁剪窗口越大,相对的裁剪窗口中的物体就越小。
6)void glMatrixMode(uint mode);
定义:设置矩阵模式
参数:
mode:矩阵模式
7)void glLoadIdentity();
定义:设置矩阵为单位矩阵
8)void glPushMatrix();
将当前矩阵入栈
9)void glPopMatrix();
把栈顶的矩阵赋给当前矩阵
2、开启或关闭某项功能
glEnable(uint cap)函数是开启功能,参数的含义如下
1)GL_DEPTH_TEST:开启深度测试,前面的物体会挡住后面的物体
2)GL_TEXTURE_2D:开启纹理功能
3)GL_LIGHTING:开启光照功能
4)GL_LIGHT0:启用0号光源
5)GL_COLOR_MATERIAL:在激活光照的情况下用glColor函数给物体上色
6)GL_BLEND:开启混合功能
glDisable(uint cap)函数是关闭功能,参数的含义同上
3、深度缓存的相关函数
深度缓冲是这样一段数据,它记录了每一个像素距离观察者有多近。在启用深度缓冲测试的情况下,如果将要绘制的像素比原来的像素更近,则像素将被绘制。否则,像素就会被忽略掉,不进行绘制。这在绘制不透明的物体时非常有用——不管是先绘制近的物体再绘制远的物体,还是先绘制远的物体再绘制近的物体,或者干脆以混乱的顺序进行绘制,最后的显示结果总是近的物体遮住远的物体。
然而在你需要实现半透明效果时,发现一切都不是那么美好了。如果你绘制了一个近距离的半透明物体,则它在深度缓冲区内保留了一些信息,使得远处的物体将无法再被绘制出来。虽然半透明的物体仍然半透明,但透过它看到的却不是正确的内容了。
绘制顺序是:首先绘制所有不透明的物体。如果两个物体都是不透明的,则谁先谁后都没有关系。然后,将深度缓冲区设置为只读。接下来,绘制所有半透明的物体。如果两个物体都是半透明的,则谁先谁后只需要根据自己的意愿(注意了,先绘制的将成为“目标颜色”,后绘制的将成为“源颜色”,所以绘制的顺序将会对结果造成一些影响)。最后,将深度缓冲区设置为可读可写形式。
调用glDepthMask(GL_FALSE);可将深度缓冲区设置为只读形式。调用glDepthMask(GL_TRUE);可将深度缓冲区设置为可读可写形式。
1)void glDepthMask(byte flag)
定义:设置深度缓冲区的读写方式
参数 :
flag :GL_FALSE,可将深度缓冲区设置为只读形式;GL_TRUE可将深度缓冲区设置为可读可写形式。
2)void glClearDepth(double depth)
定义:指定深度缓冲区的清除值
参数 :
depth:清除值。
3)void glDepthFunc(uint func)
定义:指定用于深度缓冲比较值
参数 :
指定深度比较函数,缺省值GL_LESS
GL_NEVER,不通过(输入的深度值不取代参考值)
GL_LESS,如果输入的深度值小于参考值,则通过
GL_EQUAL,如果输入的深度值等于参考值,则通过
GL_LEQUAL,如果输入的深度值小于或等于参考值,则通过
GL_GREATER,如果输入的深度值大于参考值,则通过
GL_NOTE_QUAL,如果输入的深度值不等于参考值,则通过
GL_GEQUAL,如果输入的深度值大于或等于参考值,则通过
GL_ALWAYS,总是通过(输入的深度值取代参考值)
4、查看Opengl状态变量
1)string glGetString(uint name)
定义:查询字符串信息
参数 :
Name:指定返回的字符串的类型
GL_VERSION:返回当前OpenGL实现的版本号
GL_VENDOR:返回负责当前OpenGL实现厂商的名字
GL_RENDERER:返回一个渲染器标识符,通常是个硬件平台
5、绘图函数
1)glBegin(GLenum mode)
该函数的参数就是指定的图元的类型,主要包括如表所示的内容:
类型 | 说明 |
GL_POINTS | 单个顶点集 |
GL_LINES | 多组双顶点线段 |
GL_POLYGON | 单个简单填充凸多边形 |
GL_TRAINGLES | 多组独立填充三角形 |
GL_QUADS | 多组独立填充四边形 |
GL_LINE_STRIP | 不闭合折线 |
GL_LINE_LOOP | 闭合折线 |
GL_TRAINGLE_STRIP | 线型连续填充三角形串 |
GL_TRAINGLE_FAN | 扇形连续填充三角形串 |
GL_QUAD_STRIP | 连续填充四边形串 |
2)glEnd()
定义:结束本次绘图
3)void glVertex3f(float x,float y, float z)
定义:设置图形的顶点
4)glLineWidth(float width)
定义:设置线的宽度,以像素为单位
4) glPointSize(float size)
定义:设置点的直径,以像素为单位
6、光照
6.1、控制光源
在OpenGL中,仅仅支持有限数量的光源。使用GL_LIGHT0表示第0号光源,GL_LIGHT1表示第1号光源,依次类推,OpenGL至少会支持8个光源,即GL_LIGHT0到GL_LIGHT7。
每一个光源都可以设置其属性,这一动作是通过glLight*函数完成的。glLight*函数具有三个参数,第一个参数指明是设置哪一个光源的属性,第二个参数指明是设置该光源的哪一个属性,第三个参数则是指明把该属性值设置成多少。光源的属性众多,下面将分别介绍。
(1)GL_AMBIENT、GL_DIFFUSE、GL_SPECULAR属性。这三个属性表示了光源所发出的光的反射特性(以及颜色)。每个属性由四个值表示,分别代表了颜色的R, G, B, A值。GL_AMBIENT表示该光源所发出的光,经过非常多次的反射后,最终遗留在整个光照环境中的强度(颜色)。GL_DIFFUSE表示该光源所发出的光,照射到粗糙表面时经过漫反射,所得到的光的强度(颜色)。GL_SPECULAR表示该光源所发出的光,照射到光滑表面时经过镜面反射,所得到的光的强度(颜色)。
(2)GL_POSITION属性。表示光源所在的位置。由四个值(X, Y, Z, W)表示。如果第四个值W为零,则表示该光源位于无限远处,前三个值表示了它所在的方向。这种光源称为方向性光源,通常,太阳可以近似的被认为是方向性光源。如果第四个值W不为零,则X/W, Y/W, Z/W表示了光源的位置。这种光源称为位置性光源。对于位置性光源,设置其位置与设置多边形顶点的方式相似,各种矩阵变换函数例如:glTranslate*、glRotate*等在这里也同样有效。方向性光源在计算时比位置性光源快了不少,因此,在视觉效果允许的情况下,应该尽可能的使用方向性光源。
前三个值是相对于物体坐标系的向量,OpenGL中把它转换成视图坐标系中的坐标
(3)GL_SPOT_DIRECTION、GL_SPOT_EXPONENT、GL_SPOT_CUTOFF属性。表示将光源作为聚光灯使用(这些属性只对位置性光源有效)。很多光源都是向四面八方发射光线,但有时候一些光源则是只向某个方向发射,比如手电筒,只向一个较小的角度发射光线。GL_SPOT_DIRECTION属性有三个值,表示一个向量,即光源发射的方向。GL_SPOT_EXPONENT属性只有一个值,表示聚光的程度,为零时表示光照范围内向各方向发射的光线强度相同,为正数时表示光照向中央集中,正对发射方向的位置受到更多光照,其它位置受到较少光照。数值越大,聚光效果就越明显。GL_SPOT_CUTOFF属性也只有一个值,表示一个角度,它是光源发射光线所覆盖角度的一半(见图2),其取值范围在0到90之间,也可以取180这个特殊值。取值为180时表示光源发射光线覆盖360度,即不使用聚光灯,向全周围发射。
图2
(4)GL_CONSTANT_ATTENUATION、GL_LINEAR_ATTENUATION、GL_QUADRATIC_ATTENUATION属性。这三个属性表示了光源所发出的光线的直线传播特性(这些属性只对位置性光源有效)。现实生活中,光线的强度随着距离的增加而减弱,OpenGL把这个减弱的趋势抽象成函数:衰减因子 = 1 / (k1 + k2 * d + k3 * k3 * d);其中d表示距离,光线的初始强度乘以衰减因子,就得到对应距离的光线强度。k1, k2, k3分别就是GL_CONSTANT_ATTENUATION, GL_LINEAR_ATTENUATION, GL_QUADRATIC_ATTENUATION。通过设置这三个常数,就可以控制光线在传播过程中的减弱趋势。
属性还真是不少。当然了,如果是使用方向性光源,(3)(4)这两类属性就不会用到了,问题就变得简单明了。
6.2、控制材质
材质与光源相似,也需要设置众多的属性。不同的是,光源是通过glLight*函数来设置的,而材质则是通过glMaterial*函数来设置的。
glMaterial*函数有三个参数。第一个参数表示指定哪一面的属性。可以是GL_FRONT、GL_BACK或者GL_FRONT_AND_BACK。分别表示设置“正面”“背面”的材质,或者两面同时设置。(关于“正面”“背面”的内容需要参看前些课程的内容)第二、第三个参数与glLight*函数的第二、三个参数作用类似。下面分别说明glMaterial*函数可以指定的材质属性。
(1)GL_AMBIENT、GL_DIFFUSE、GL_SPECULAR属性。这三个属性与光源的三个对应属性类似,每一属性都由四个值组成。GL_AMBIENT表示各种光线照射到该材质上,经过很多次反射后最终遗留在环境中的光线强度(颜色)。GL_DIFFUSE表示光线照射到该材质上,经过漫反射后形成的光线强度(颜色)。GL_SPECULAR表示光线照射到该材质上,经过镜面反射后形成的光线强度(颜色)。通常,GL_AMBIENT和GL_DIFFUSE都取相同的值,可以达到比较真实的效果。使用GL_AMBIENT_AND_DIFFUSE可以同时设置GL_AMBIENT和GL_DIFFUSE属性。
(2)GL_SHININESS属性。该属性只有一个值,称为“镜面指数”,取值范围是0到128。该值越小,表示材质越粗糙,点光源发射的光线照射到上面,也可以产生较大的亮点。该值越大,表示材质越类似于镜面,光源照射到上面后,产生较小的亮点。
(3)GL_EMISSION属性。该属性由四个值组成,表示一种颜色。OpenGL认为该材质本身就微微的向外发射光线,以至于眼睛感觉到它有这样的颜色,但这光线又比较微弱,以至于不会影响到其它物体的颜色。
(4)GL_COLOR_INDEXES属性。该属性仅在颜色索引模式下使用,由于颜色索引模式下的光照比RGBA模式要复杂,并且使用范围较小,这里不做讨论。
6.3、选择光照模型
在OpenGL中,光照模型包括四个部分的内容:全局环境光线(即那些充分散射,无法分清究竟来自哪个光源的光线)的强度、观察点位置是在较近位置还是在无限远处、物体正面与背面是否分别计算光照、镜面颜色(即GL_SPECULAR属性所指定的颜色)的计算是否从其它光照计算中分离出来,并在纹理操作以后在进行应用。
以上四方面的内容都通过同一个函数glLightModel*来进行设置。该函数有两个参数,第一个表示要设置的项目,第二个参数表示要设置成的值。
GL_LIGHT_MODEL_AMBIENT表示全局环境光线强度,由四个值组成。
这也就是为什么我们不加任何自定义光源,也能看见绘制的物体的原因。
GL_LIGHT_MODEL_LOCAL_VIEWER表示是否在近处观看,若是则设置为GL_TRUE,否则(即在无限远处观看)设置为GL_FALSE。
GL_LIGHT_MODEL_TWO_SIDE表示是否执行双面光照计算。如果设置为GL_TRUE,则OpenGL不仅将根据法线向量计算正面的光照,也会将法线向量反转并计算背面的光照。
GL_LIGHT_MODEL_COLOR_CONTROL表示颜色计算方式。如果设置为GL_SINGLE_COLOR,表示按通常顺序操作,先计算光照,再计算纹理。如果设置为GL_SEPARATE_SPECULAR_COLOR,表示将GL_SPECULAR属性分离出来,先计算光照的其它部分,待纹理操作完成后再计算GL_SPECULAR。后者通常可以使画面效果更为逼真(当然,如果本身就没有执行任何纹理操作,这样的分离就没有任何意义)。
6.4、材质RGB值和光源RGB值的关系
材质的颜色与光源的颜色有些不同。对于光源,R、G、B值等于R、G、B对其最大强度的百分比。若光源颜色的R、G、B值都是1.0,则是最强的白光;若值变为0.5,颜色仍为白色,但强度为原来的一半,于是表现为灰色;若R=G=1.0,B=0.0,则光源为黄色。对于材质,R、G、B值为材质对光的R、G、B成分的反射率。比如,一种材质的R=1.0、G=0.5、B=0.0,则材质反射全部的红色成分,一半的绿色成分,不反射蓝色成分。也就是说,若OpenGL的光源颜色为(LR、LG、LB),材质颜色为(MR、MG、MB),那么,在忽略所有其他反射效果的情况下,最终到达眼睛的光的颜色为(LR*MR、LG*MG、LB*MB)。
同样,如果有两束光,相应的值分别为(R1、G1、B1)和(R2、G2、B2),则OpenGL将各个颜色成分相加,得到(R1+R2、G1+G2、B1+B2),若任一成分的和值大于1(超出了设备所能显示的亮度)则约简到1.0。下面一例程就说明了二者之间的关系。
6.5、光照相关知识
1. 几个概念
1)环境光——经过多次反射而来的光称为环境光,无法确定其最初的方向,但当特定的光源关闭后,它们将消失.
2)全局环境光——它们并非来自特定的光源,这些光经过了多次散射,已经无法确定其光源位于何处.
3)散射光——来自同一方向,照射到物体表面后,将沿各个方向均匀反射,因此,无论从哪个方向观察,表面的亮度都相同.
4)镜面反射光——来自特定方向,也被反射到特定方向.镜面反射度与之相关.
5)材质发射光——用于模拟发光物体.在OpenGL光照模型中,表面的发射光增加了物体的亮度,它不受光源的影响,另外,发射光不会给整个场景中增加光线.
2. OpenGL光照中的默认值
2.1光源
光源的环境光默认为(0.0,0.0,0.0,1.0),即没有环境光.
光源的散射光默认为(1.0,1.0,1.0,1.0),即存在白色散射光.
光源的环境反射光默认值有两种情况,一种对应于光源GL_LIGNT0,其GL_SPECULAR为(1.0,1.0,1.0,1.0),即白色光;另一种对应于其它光源,其默认值为(0.0,0.0,0.0,0.0).一般情况下,光源的GL_SPECULAR应该和GL_DIFFUSE值相同.
默认情况下,定位光源向所有方向发射光,但可以将其设置为聚光灯,使之在锥体内发光.
2.2光照模型
光照模型中,全局环境光默认为(0.2,0.2,0.2,1.0),即存在微弱的白光;视点位置默认为0.0或者GL_FALSE,即无穷远处;默认采用单面光照,即GL_LIGHT_MODEL_TWO_SIDE为0.0或GL_FALSE(在对物体存在切割时,要启用双面光照);默认情况下,镜面反射颜色在纹理映射之前完成,即GL_LIGHT_MODEL_COLOR_CONTROL的值为GL_SINGLE_COLOR.
2.2材质属性
材质属性的默认值:GL_AMBIENT (0.2,0.2,0.2,1.0); GL_DIFFUSE (0.8,0.8,0.8,1.0); GL_SPECULAR (0.0,0.0,0.0,1.0); GL_SHINNESS 0.0; GL_EMISSION (0.0,0.0,0.0,1.0).
3. 计算
顶点被照射时的颜色:顶点颜色=顶点的发射光颜色 +全局环境光与材质的环境光属性 +各光源中衰减后的环境光,散射光和镜面反射光执行光照计算后,颜色值(RGBA模式)被截取到[0.0,1.0].
顶点的发射光颜色即glMaterialfv()中的GL_EMISSION值.
反射的全局环境光 = glLightModelfv()指定的GL_AMBIENT * glMaterialfv()指定的GL_AMBIENT值.
光源的贡献 = 衰减因子 * 聚光效果 * (环境光 + 散射光 + 镜面反射光);其中,环境光 = glLightfv()指定的GL_AMBIENT * glMaterialfv()指定的GL_AMBIENT;
散射光的计算需要考虑光线的照射角度,光源散射分量和材质的散射属性:
散射光 =(max{L dotproduct n,0} * light_diffuse * material_diffuse),L为顶点到光源的 单位矢量,n为顶点的单位法线向量.
镜面反射光项也取决于光线的照射角度.若(L dotproduct n)<=0;顶点将没有镜面反射光项,否 则镜面反射光取决于下列因素:
1) 顶点的单位法向量n.
2) 从顶点指向光源的单位矢量和从顶点指向视点的单位向量的和,此处假设光照模型中采用近视点,否则第二个被加的单位向量为(0,0,1);然后将相加得到的向量归一化,记为s.
3) 镜面反射指数(glLightfv()指定的GL_SHINNESS).
4) 光源的镜面反射光分量(glLightfv()指定的GL_SPECULAR,一般和其GL_DIFFUSE相同).
5) 材质的镜面反射属性(glMaterialfv()指定的GL_SPECULAR).
计算公式:(max{s dotproduct n,0})^shinness * light_specular * material_specular
6.5、函数
1)void glLight*( light, pname, someParams) 等;
定义:光源的设置
参数:
Light:光源
Pname:光源属性
someParams:表示相应光源属性值
2)void glNormal*(nx, ny, nz);
定义:设置光源的法向量
参数:
nx, ny, nz :向量
1)void glMaterial (face, pname, someParams) 等;
定义:光照材质的设定
参数:
face:指定哪一面的属性
Pname:光源属性
someParams:表示相应光源属性值
1)void glLightModel* (pname, someParams) 等;
定义:光照模型的设定
参数:
Light Pname:表示要设置的项目
someParams:表示要设置成的值
7、混合
1) glBlendFunc(uint sfactor,uint dfactor)
源因子和目标因子是可以通过glBlendFunc函数来进行设置的。glBlendFunc有两个参数,前者表示源因子,后者表示目标因子。这两个参数可以是多种值,下面介绍比较常用的几种。
GL_ZERO:表示使用0.0作为因子,实际上相当于不使用这种颜色参与混合运算。
GL_ONE:表示使用1.0作为因子,实际上相当于完全的使用了这种颜色参与混合运算。
GL_SRC_ALPHA:表示使用源颜色的alpha值来作为因子。
GL_DST_ALPHA:表示使用目标颜色的alpha值来作为因子。
GL_ONE_MINUS_SRC_ALPHA:表示用1.0减去源颜色的alpha值来作为因子。
GL_ONE_MINUS_DST_ALPHA:表示用1.0减去目标颜色的alpha值来作为因子。除此以外,还有GL_SRC_COLOR(把源颜色的四个分量分别作为因子的四个分量)、GL_ONE_MINUS_SRC_COLOR、 GL_DST_COLOR、GL_ONE_MINUS_DST_COLOR等,前两个在OpenGL旧版本中只能用于设置目标因子,后两个在OpenGL旧版本中只能用于设置源因子。新版本的OpenGL则没有这个限制,并且支持新的GL_CONST_COLOR(设定一种常数颜色,将其四个分量分别作为因子的四个分量)、GL_ONE_MINUS_CONST_COLOR、GL_CONST_ALPHA、 GL_ONE_MINUS_CONST_ALPHA。另外还有GL_SRC_ALPHA_SATURATE。新版本的OpenGL还允许颜色的alpha值和RGB值采用不同的混合因子。
举例来说:如果设置了glBlendFunc(GL_ONE, GL_ZERO);,则表示完全使用源颜色,完全不使用目标颜色,因此画面效果和不使用混合的时候一致(当然效率可能会低一点点)。如果没有设置源因子和目标因子,则默认情况就是这样的设置。如果设置了glBlendFunc(GL_ZERO, GL_ONE);,则表示完全不使用源颜色,因此无论你想画什么,最后都不会被画上去了。(但这并不是说这样设置就没有用,有些时候可能有特殊用途)如果设置了glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);,则表示源颜色乘以自身的alpha值,目标颜色乘以1.0减去源颜色的alpha值,这样一来,源颜色的alpha值越大,则产生的新颜色中源颜色所占比例就越大,而目标颜色所占比例则减小。这种情况下,我们可以简单的将源颜色的alpha值理解为“不透明度”。这也是混合时最常用的方式。如果设置了glBlendFunc(GL_ONE, GL_ONE);,则表示完全使用源颜色和目标颜色,最终的颜色实际上就是两种颜色的简单相加。例如红色(1, 0, 0)和绿色(0, 1, 0)相加得到(1, 1, 0),结果为黄色。
公式如下:
(Rs Sr + Rd Dr, Gs Sg + Gd Dg, Bs Sb + Bd Db, As Sa + Ad Da)
OpenGL按照上面的公式计算这两个象素的混色结果。小写的s和r分别代表源象素和目标象素。大写的S和D则是相应的混色因子。
(个人理解,一般情况下Sr=Sg=Sb=Sa; Dr=Dg=Db=Da 故公式变为:
Rs Sa + Rd Da, Gs Sa + Gd Da, Bs Sa + Bd Da, As Sa + Ad Da)
注意:所谓源颜色和目标颜色,是跟绘制的顺序有关的。假如先绘制了一个红色的物体,再在其上绘制绿色的物体。则绿色是源颜色,红色是目标颜色。如果顺序反过来,则红色就是源颜色,绿色才是目标颜色。在绘制时,应该注意顺序,使得绘制的源颜色与设置的源因子对应,目标颜色与设置的目标因子对应。不要被混乱的顺序搞晕。
开启混合功能时,应关闭深度测试;
8、纹理
1)glGenTextures(int n,uint[] textures);
定义:创建纹理
参数 :
n :表示创建纹理的数量
textures:返回纹理对象数组
2)glBindTexture(uint target,uint texture);
定义:绑定纹理
参数:
Target:纹理目标
Texture:纹理对象
3)glTexImage2D(uint target,int level, uint internalformat,int width, int height,int border, uint format,uint type, IntPtr pixels);
定义:生成纹理
参数:
Target:纹理目标
level,:纹理的层次
internalformat:纹理数据在OpenGL中是如何表示的,如GL_RGB就表示纹理的像素在OpenGL里面以红绿蓝三个分量表示
width,height:载入纹理时候,数据所包含的纹理的宽度和高度
border: 指的是纹理的边界,可以设置成0;
format: 指的是载入纹理的格式,它告诉OpenGL外部数据是如何表示单个像素的,如GL_RED表示数据每个像素只有红色分量,GL_RGBA表示是红绿蓝alpha四个分量组成一个像素;
type: 表示一个像素中每个分量所占用的空间大小,如GL_FLOAT就表示每个分量是一个浮点数;GL_UNSIGNED_BYTE表示每个分量用一个无符号byte表示
pixels:没有什么好说的,就是外部纹理数据的起始地址
4)glTexParameterf(uint target,uint pname, float param);
定义:放大得比原始的纹理大 ( GL_TEXTURE_MAG_FILTER )或缩小得比原始得纹理小( GL_TEXTURE_MIN_FILTER )时OpenGL采用的滤波方式
参数:
Target:纹理目标
Pname:用来设置纹理映射过程中像素映射的问题等,取值可以为:GL_TEXTURE_MIN_FILTER、GL_TEXTURE_MAG_FILTER
Param:pname的值
5)glTexCoord2f(float s,float t)
定义:将纹理正确的映射到图形上。
参数:
S:是X坐标。 0.0f是纹理的左侧。 0.5f 是纹理的中点, 1.0f是纹理的右侧。
T:是Y坐标。 0.0f是纹理的底部。 0.5f 是纹理的中点, 1.0f是纹理的顶部
纹理叠加的效果:纹理和绘制时的颜色进行叠加显示。无光照,和当前颜色缓冲区的颜色进行叠加;有光照,开启GL_COLOR_MATERIAL时和当前颜色缓冲区的颜色进行叠加,未开启GL_COLOR_MATERIAL时和光照的颜色进行叠加;
9、显示列表
1)uint glGenLists(int range)
定义:建立显示列表的空间,并返回第一个显示列表的指针
参数:
Range: 显示列表的个数
2)glNewList(uint list,uint mode)
定义:创建显示列表
参数:
List:把列表存储在内存空间的指针
Mode:显示列表的模式,GL_COMPILE告诉OpenGL我们想预先在内存中构造这个列表,这样每次画的时候就不必重新计算怎么构造物体了
3)glEndList();
定义:结束显示列表
4)glCallList(uint list);
定义:调用显示列表
参数:
List:把列表存储在内存空间的指针
10、二次几何体
1)gluNewQuadric();
定义:创建二次几何体的指针
2)gluQuadricNormals(GLUquadric quad,uint normal);
定义:指定二次几何体法线的模式
参数:
quad:二次几何体的指针
normal:GLU_SMOOTH、GLU_NONE、GLU_FLAT
3)gluQuadricTexture(GLUquadric quad,byte texture)
定义:指定二次几何体是否使用纹理
参数:
quad:二次几何体的指针
texture:0或1;禁用或启用
4)gluDeleteQuadric(GLUquadric quad)
定义:删除二次几何体
参数:
quad:二次几何体的指针
5)gluCylinder(GLUquadric quad,double myBase, double top,double height, int slices,int stacks)
定义:绘制圆柱体
参数:
quad:二次几何体的指针
myBase:圆柱体的底面半径
top:圆柱体的顶面半径
height:圆柱体的高度
slices:纬线(环绕Z轴有多少细分)
stacks:经线(沿着Z轴有多少细分)
纬线、经线细分越多该对象就越细致
5)gluDisk(GLUquadric quad, double inner, double outer, int slices, int loops);
定义:绘制圆盘
参数:
quad:二次几何体的指针
inner:内圆半径,该参数可以为0,则表示在盘子中间没孔,内圆半径越大孔越大
outer:外圆半径,这个参数必须比内圆半径大
slices:切片的数量;切片越多,外圆边缘就越平滑
loops:环的数量
6)gluSphere(GLUquadric quad, double radius, int slices, int stacks);
定义:绘制球体
参数:
quad:二次几何体的指针
radius:球的半径
slices:纬线
stacks:经线
7)gluPartialDisk(GLUquadric quad,double inner, double outer,int slices, int loops,double start, double sweep);
定义:绘制部分圆盘
参数:
quad:二次几何体的指针
inner:内圆半径,该参数可以为0,则表示在盘子中间没孔,内圆半径越大孔越大
outer:外圆半径,这个参数必须比内圆半径大
slices:切片的数量;切片越多,外圆边缘就越平滑
loops:环的数量
start:开始角度
sweep:旋转角度
菁菁报表中的3维图表是通过OpenGL技术实现的,详情可参考www.qxexpress.com