天堂向右,我依然向左

天下之大,虽离家千里,何处不可往!何事不可为!
生活之路,纵坎坷曲折,当奋斗不息,则精彩纷呈!

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
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通道值的半透明混合函数
posted on 2010-09-07 20:33  老舟  阅读(303)  评论(0编辑  收藏  举报