glLoadIdentity()
// 重置当前的模型观察矩阵调用,glLoadIdentity()之后,您实际上将当前点移到了屏幕中心。
glTranslatef(x, y, z) //沿着 X, Y 和 Z 轴移动。
glTranslatef(-1.5f,0.0f,-6.0f);
//沿着X轴左移1.5个单位,Y轴不动(0.0f),最后移入屏幕6.0f个单位
当您用函数移动的时候,您并不是相对屏幕中心移动,而是相对与当前所在的屏幕位置。
画多边形过程:
glBegin(GL_TRIANGLES) 的意思是开始绘制三角形
……
它们之间的点都是以三点为一个集合的,这同样适用于四边形
GL_QUADS。
glVertex 的第一个参数是X坐标,然后依次是Y坐标和Z坐标。
第一个点是上顶点,然后是左下顶点和右下顶点。
glEnd() 告诉OpenGL三角形已经创建好了。
色彩值:
色彩值的范围从0.0f到1.0f。0.0f代表最黑的情况,1.0f就是最亮的情况。glClearColor 后的第一个参数是Red Intensity(红色分量),第二个是绿色,第三个是蓝色。
glColor3f(r,g,b)。括号中的三个参数依次是红、绿、蓝三色分量。
旋转角度:
GLfloat
rtri; // 定义用于三角形的角度
GLfloat
rquad; // 定义用于四边形的角度
glRotatef(Angle,Xvector,Yvector,Zvector)
//负责让对象绕某个轴旋转。
rtri+=0.2f;
// 增加三角形的旋转变量(速度)—置于参数Angle中
rquad-=0.15f;
// 减少四边形的旋转变量
加载图像:
图像的宽和高必须是2的n次方;宽度和高度最小必须是64象素;并且出于兼容性的原因,图像的宽度和高度不应超过256象素。如果您的原始素材的宽度和高度不是64,128,256象素的话,使用图像处理软件重新改变图像的大小。可以肯定有办法能绕过这些限制,但现在我们只需要用标准的纹理尺寸。
AUX_RGBImageRec *LoadBMP(char *Filename)
//
载入位图图象
{
FILE *File=NULL; // 文件句柄
if (!Filename)
// 确保文件名已提供
{return NULL;} // 如果没提供,返回 NULL
File=fopen(Filename,"r");
// 尝试打开文件
if (File)
// 文件存在么?
{
fclose(File); // 关闭句柄
return auxDIBImageLoad(Filename); // 载入位图并返回指针
}
return NULL;
// 如果载入失败,返回 NULL
}
int LoadGLTextures()
//
载入位图(
调用上面的代码)
并转换成纹理
{
int Status=FALSE;
// 状态指示器
AUX_RGBImageRec *TextureImage[1];
// 创建纹理的存储空间
memset(TextureImage,0,sizeof(void *)*1);
// 将指针设为 NULL
// 载入位图,检查有无错误,如果位图没找到则退出
if (TextureImage[0]=LoadBMP("Data/NeHe.bmp"))
{
Status=TRUE; // 将 Status 设为 TRUE
glGenTextures(1, &texture[0]); // 创建一个纹理
// 使用来自位图数据生成 的典型纹理
glBindTexture(GL_TEXTURE_2D, texture[0]);
// 生成纹理
glTexImage2D(GL_TEXTURE_2D,0,3,TextureImage[0]->sizeX,TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
//上面一行告诉OpenGL此纹理是一个2D纹理 ( GL_TEXTURE_2D )。参数“0”代表图像的详细程度,通常就由它为零去了。参数三是数据的成分数。因为图像是由红色数据,绿色数据,蓝色数据三种组分组成。 TextureImage[0]->sizeX 是纹理的宽度。如果您知道宽度,您可以在这里填入,但计算机可以很容易的为您指出此值。 TextureImage[0]->sizey 是纹理的高度。参数零是边框的值,一般就是“0”。 GL_RGB 告诉OpenGL图像数据由红、绿、蓝三色数据组成。GL_UNSIGNED_BYTE 意味着组成图像的数据是无符号字节类型的。最后... TextureImage[0]->data 告诉OpenGL纹理数据的来源。此例中指向存放在 TextureImage[0] 记录中的数据。
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
}
if (TextureImage[0]) // 纹理是否存在
{
if (TextureImage[0]->data) // 纹理图像是否存在
{
free(TextureImage[0]->data); // 释放纹理图像占用的内存
}
free(TextureImage[0]); // 释放图像结构
}
return Status;
// 返回 Status
}
绘制贴图(纹理映射)过的立方体:
glTexCoord2f 的第一个参数是X坐标。
0.0f 是纹理的左侧。1.0f 是纹理的右侧。 glTexCoord2f 的第二个参数是Y坐标。
0.0f 是纹理的底部。 1.0f 是纹理的顶部。
一般表达方式:
glBegin(GL_QUADS);
// 前面
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
// 纹理和四边形的左下
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
// 纹理和四边形的右下
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); // 纹理和四边形的右上
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
// 纹理和四边形的左上
……
glEnd();
光照:
GLfloat LightAmbient[]= { 0.5f, 0.5f, 0.5f, 1.0f };
// 环境光参数
我们得到的是半亮(0.5f)的白色环境光。
如果没有环境光,未被漫射光照到的地方会变得十分黑暗。
GLfloat LightDiffuse[]= { 1.0f, 1.0f, 1.0f, 1.0f };
// 漫射光参数
GLfloat LightPosition[]= { 0.0f, 0.0f, 2.0f, 1.0f };
// 光源位置
int InitGL(GLvoid)中设置:
glLightfv(GL_LIGHT1, GL_AMBIENT,
LightAmbient);
// 设置环境光
glLightfv(GL_LIGHT1, GL_DIFFUSE,
LightDiffuse);
// 设置漫射光
glLightfv(GL_LIGHT1, GL_POSITION,
LightPosition);
// 设置光源位置
glEnable(GL_LIGHT1);
// 启用一号光源
键盘控制:
if (keys['L'] && !lp)
// L 键已按下并且松开了?
{
lp=TRUE;
// lp 设为 TRUE
light=!light;
// 切换光源的 TRUE/FALSE
if (!light)
// 如果没有光源
{
glDisable(GL_LIGHTING); // 禁用光源
}
else // 否则
{
glEnable(GL_LIGHTING); // 启用光源
}
}
if (!keys['L'])
// L键松开了么?
{
lp=FALSE; // 若是,则将lp设为FALSE
}
if (keys[VK_PRIOR])
// PageUp按下了?
{
z-=0.02f; // 若按下,将木箱移向屏幕内部
}
if (keys[VK_PRIOR])
// PageUp按下了?
{
z-=0.02f; // 若按下,将木箱移向屏幕内部
}
混合(Blend
):
绝大多数人都认为Alpha分量代表材料的透明度。这就是说,alpha值为0.0时所代表的材料是完全透明的。alpha值为1.0时所代表的材料则是完全不透明的。
glColor4f(1.0f,1.0f,1.0f,0.5f);
// 全亮度, 50% Alpha 混合(GL_RGBA)
glBlendFunc(GL_SRC_ALPHA,GL_ONE);
// 基于源象素alpha通道值的半透明混合函数