OpenGL编程参考

 

1、矩阵变换

1void glTranslatef(float x,float y, float z);

定义:模型变换矩阵

参数:x ,y, z 变换的坐标(用世界坐标系来表示的);

 

2voidgluLookAt(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轴的正方向的近似方向(用世界坐标系来表示的);

 

其它说明:

投影方向:观测点坐标到中心点坐标向量的相反方向

3void glRotatef(float angle,float x, float y,float z);

定义:选择坐标轴。

参数:angle :选转的角度,正表示逆时针旋转,负表示顺时针旋转;

      x,y,z,表示向量,决定选转的轴

3void glOrtho(double left,double right, double bottom,double top, double zNear,double zFar);

定义:正交投影,正交投影是大小不变的投影。

参数:参数表示的是投影的空间

 

4void glFrustum(double left,double right, double bottom,double top, double zNear,double zFar);

定义:透视投影,透视投影有近大远小的效果

参数:参数表示的是投影的空间

 

5void gluPerspective(double fovy,double aspect, double zNear,double zFar);

定义:透视投影,透视投影有近大远小的效果

参数:near far决定了投影参考点与裁剪窗口的距离,

fovy决定了裁剪窗口的高度

         aspect 确定了裁剪窗口的长宽比例。

其它说明:

fovy越大,裁剪窗口越大,相对的裁剪窗口中的物体就越小。

6void glMatrixMode(uint mode);

定义:设置矩阵模式

参数:

mode:矩阵模式

7void glLoadIdentity();

 

定义:设置矩阵为单位矩阵

 

8void glPushMatrix();

将当前矩阵入栈

9void glPopMatrix();

把栈顶的矩阵赋给当前矩阵

2、开启或关闭某项功能

glEnable(uint cap)函数是开启功能,参数的含义如下

1GL_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);可将深度缓冲区设置为可读可写形式。

1void glDepthMask(byte flag)

定义:设置深度缓冲区的读写方式

参数 :

flag :GL_FALSE,可将深度缓冲区设置为只读形式;GL_TRUE可将深度缓冲区设置为可读可写形式。

2void glClearDepth(double depth)

定义:指定深度缓冲区的清除值

参数 :

depth:清除值

3void glDepthFunc(uint func)

定义:指定用于深度缓冲比较值

参数 :

指定深度比较函数,缺省值GL_LESS

GL_NEVER,不通过(输入的深度值不取代参考值)

GL_LESS,如果输入的深度值小于参考值,则通过

GL_EQUAL,如果输入的深度值等于参考值,则通过

GL_LEQUAL,如果输入的深度值小于或等于参考值,则通过

GL_GREATER,如果输入的深度值大于参考值,则通过

GL_NOTE_QUAL,如果输入的深度值不等于参考值,则通过

GL_GEQUAL,如果输入的深度值大于或等于参考值,则通过

GL_ALWAYS,总是通过(输入的深度值取代参考值)

 

4、查看Opengl状态变量

1string glGetString(uint name)

定义:查询字符串信息

参数 :

Name:指定返回的字符串的类型

GL_VERSION返回当前OpenGL实现的版本号

GL_VENDOR:返回负责当前OpenGL实现厂商的名字

GL_RENDERER:返回一个渲染器标识符,通常是个硬件平台

 

5、绘图函数

1glBegin(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

连续填充四边形串

 

2glEnd()

定义:结束本次绘图

3void 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_LIGHT0GL_LIGHT7

每一个光源都可以设置其属性,这一动作是通过glLight*函数完成的。glLight*函数具有三个参数,第一个参数指明是设置哪一个光源的属性,第二个参数指明是设置该光源的哪一个属性,第三个参数则是指明把该属性值设置成多少。光源的属性众多,下面将分别介绍。

1GL_AMBIENTGL_DIFFUSEGL_SPECULAR属性。这三个属性表示了光源所发出的光的反射特性(以及颜色)。每个属性由四个值表示,分别代表了颜色的R, G, B, A值。GL_AMBIENT表示该光源所发出的光,经过非常多次的反射后,最终遗留在整个光照环境中的强度(颜色)。GL_DIFFUSE表示该光源所发出的光,照射到粗糙表面时经过漫反射,所得到的光的强度(颜色)。GL_SPECULAR表示该光源所发出的光,照射到光滑表面时经过镜面反射,所得到的光的强度(颜色)。

2GL_POSITION属性。表示光源所在的位置。由四个值(X, Y, Z, W)表示。如果第四个值W为零,则表示该光源位于无限远处,前三个值表示了它所在的方向。这种光源称为方向性光源,通常,太阳可以近似的被认为是方向性光源。如果第四个值W不为零,则X/W, Y/W, Z/W表示了光源的位置。这种光源称为位置性光源。对于位置性光源,设置其位置与设置多边形顶点的方式相似,各种矩阵变换函数例如:glTranslate*glRotate*等在这里也同样有效。方向性光源在计算时比位置性光源快了不少,因此,在视觉效果允许的情况下,应该尽可能的使用方向性光源。

前三个值是相对于物体坐标系的向量,OpenGL中把它转换成视图坐标系中的坐标

3GL_SPOT_DIRECTIONGL_SPOT_EXPONENTGL_SPOT_CUTOFF属性。表示将光源作为聚光灯使用(这些属性只对位置性光源有效)。很多光源都是向四面八方发射光线,但有时候一些光源则是只向某个方向发射,比如手电筒,只向一个较小的角度发射光线。GL_SPOT_DIRECTION属性有三个值,表示一个向量,即光源发射的方向。GL_SPOT_EXPONENT属性只有一个值,表示聚光的程度,为零时表示光照范围内向各方向发射的光线强度相同,为正数时表示光照向中央集中,正对发射方向的位置受到更多光照,其它位置受到较少光照。数值越大,聚光效果就越明显。GL_SPOT_CUTOFF属性也只有一个值,表示一个角度,它是光源发射光线所覆盖角度的一半(见图2),其取值范围在090之间,也可以取180这个特殊值。取值为180时表示光源发射光线覆盖360度,即不使用聚光灯,向全周围发射。

2

4GL_CONSTANT_ATTENUATIONGL_LINEAR_ATTENUATIONGL_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_FRONTGL_BACK或者GL_FRONT_AND_BACK。分别表示设置正面”“背面的材质,或者两面同时设置。(关于正面”“背面的内容需要参看前些课程的内容)第二、第三个参数与glLight*函数的第二、三个参数作用类似。下面分别说明glMaterial*函数可以指定的材质属性。
1GL_AMBIENTGL_DIFFUSEGL_SPECULAR属性。这三个属性与光源的三个对应属性类似,每一属性都由四个值组成。GL_AMBIENT表示各种光线照射到该材质上,经过很多次反射后最终遗留在环境中的光线强度(颜色)。GL_DIFFUSE表示光线照射到该材质上,经过漫反射后形成的光线强度(颜色)。GL_SPECULAR表示光线照射到该材质上,经过镜面反射后形成的光线强度(颜色)。通常,GL_AMBIENTGL_DIFFUSE都取相同的值,可以达到比较真实的效果。使用GL_AMBIENT_AND_DIFFUSE可以同时设置GL_AMBIENTGL_DIFFUSE属性。

2GL_SHININESS属性。该属性只有一个值,称为镜面指数,取值范围是0128。该值越小,表示材质越粗糙,点光源发射的光线照射到上面,也可以产生较大的亮点。该值越大,表示材质越类似于镜面,光源照射到上面后,产生较小的亮点。
3GL_EMISSION属性。该属性由四个值组成,表示一种颜色。OpenGL认为该材质本身就微微的向外发射光线,以至于眼睛感觉到它有这样的颜色,但这光线又比较微弱,以至于不会影响到其它物体的颜色。
4GL_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值的关系
  材质的颜色与光源的颜色有些不同。对于光源,RGB值等于RGB对其最大强度的百分比。若光源颜色的RGB值都是1.0,则是最强的白光;若值变为0.5,颜色仍为白色,但强度为原来的一半,于是表现为灰色;若RG1.0B0.0,则光源为黄色。对于材质,RGB值为材质对光的RGB成分的反射率。比如,一种材质的R1.0G0.5B0.0,则材质反射全部的红色成分,一半的绿色成分,不反射蓝色成分。也就是说,若OpenGL的光源颜色为(LRLGLB),材质颜色为(MRMGMB),那么,在忽略所有其他反射效果的情况下,最终到达眼睛的光的颜色为(LR*MRLG*MGLB*MB)。
  同样,如果有两束光,相应的值分别为(R1G1B1)和(R2G2B2),则OpenGL将各个颜色成分相加,得到(R1+R2G1+G2B1+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、函数

1void  glLight*( light, pname, someParams) 等;

定义:光源的设置

参数:

Light:光源

Pname:光源属性

someParams:表示相应光源属性

2void glNormal*(nx, ny, nz);

定义:设置光源的法向量

参数:

nx, ny, nz :向量

1void  glMaterial (face, pname, someParams) 等;

定义:光照材质的设定

参数:

face:指定哪一面的属性

Pname:光源属性

someParams:表示相应光源属性

 

1void  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_COLORGL_ONE_MINUS_DST_COLOR等,前两个在OpenGL旧版本中只能用于设置目标因子,后两个在OpenGL旧版本中只能用于设置源因子。新版本的OpenGL则没有这个限制,并且支持新的GL_CONST_COLOR(设定一种常数颜色,将其四个分量分别作为因子的四个分量)、GL_ONE_MINUS_CONST_COLORGL_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按照上面的公式计算这两个象素的混色结果。小写的sr分别代表源象素和目标象素。大写的SD则是相应的混色因子。

 

(个人理解,一般情况下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、纹理

1glGenTextures(int n,uint[] textures);

定义:创建纹理

参数 :

n :表示创建纹理的数量

textures:返回纹理对象数组

2glBindTexture(uint target,uint texture);

定义:绑定纹理

参数:

Target:纹理目标

Texture:纹理对象

3glTexImage2D(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:没有什么好说的,就是外部纹理数据的起始地址

 

4glTexParameterf(uint target,uint pname, float param);

定义:放大得比原始的纹理大 ( GL_TEXTURE_MAG_FILTER )或缩小得比原始得纹理小( GL_TEXTURE_MIN_FILTER )OpenGL采用的滤波方式

参数:

Target:纹理目标

Pname:用来设置纹理映射过程中像素映射的问题等,取值可以为:GL_TEXTURE_MIN_FILTERGL_TEXTURE_MAG_FILTER

Param:pname的值

5glTexCoord2f(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、显示列表

1uint glGenLists(int range)

定义:建立显示列表的空间,并返回第一个显示列表的指针

参数:

Range: 显示列表的个数

 

2glNewList(uint list,uint mode)

定义:创建显示列表

参数:

List:把列表存储在内存空间的指针

Mode:显示列表的模式,GL_COMPILE告诉OpenGL我们想预先在内存中构造这个列表,这样每次画的时候就不必重新计算怎么构造物体了

3glEndList();

定义:结束显示列表

 

4)glCallList(uint list);

定义:调用显示列表

参数:

List:把列表存储在内存空间的指针

10、二次几何体

1gluNewQuadric();

定义:创建二次几何体的指针

2gluQuadricNormals(GLUquadric quad,uint normal);

定义:指定二次几何体法线的模式

参数:

quad:二次几何体的指针

normal:GLU_SMOOTHGLU_NONEGLU_FLAT

3gluQuadricTexture(GLUquadric quad,byte texture)

定义:指定二次几何体是否使用纹理

参数:

quad:二次几何体的指针

texture:01;禁用或启用

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

 

  • 1
    点赞
  • 4
    收藏
  • 打赏
    打赏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论

打赏作者

菁菁报表

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值