当前位置:编程学习 > 网站相关 >>

NeHe的OpenGL教程6(Bang翻译版)

在这一课里,我将教会你如何把纹理映射到立方体的六个面,如下图:
 
 \
 
将下图放在应用程序data目录下,起名NeHe.bmp
 
 \
 
program lesson6a;
 
{
    OpenGL DelphiXE
    出处:根据NeHe代码翻译而来(http://nehe.gamedev.net/)
    作者:帅宏军shuaihj@163.com
 
    注:本单元用到了glaux.dll和glaux.pas,下载地址为:
        http://download.csdn.net/detail/shuaihj/4043519
 
}
 
uses
  Windows,
  Messages,
  SysUtils,
  OpenGL,
  glaux;
 
procedure glGenTextures(n: GLsizei; var textures: GLuint); stdcall; external opengl32;
procedure glBindTexture(target: GLenum; texture: GLuint); stdcall; external opengl32;
 
// 全局变量
var
  h_Rc: HGLRC;                    // 窗口着色描述表句柄
  h_Dc: HDC;                        // OpenGL渲染描述表句柄
  h_Wnd: HWND;                      // 保存我们的窗口句柄
  keys: array [0..255] of BOOL;     // 保存键盘按键的数组
  Active: bool = true;              // 窗口的活动标志,缺省为TRUE
  FullScreen:bool = true;           // P全屏标志缺省,缺省设定成全屏模式
 
  rtrix, rtriy, rtriz: GLfloat;    // 用于三角形的三个方向上的角度
  rquadx, rquady, rquadz: GLfloat; // 用于四边形的三个方向上的角度
 
  texture: Array[0..0] of  GLuint; // 存储一个纹理
 
//载入位图
function LoadBMP(FileName: PAnsichar):PTAUX_RGBImageRec;    // 加载位图
begin
  if not FileExists(Filename) then                          // 位图是否存在
  begin
    Result := nil;
    exit;
  end;
 
  Result := auxDIBImageLoadA(FileName);                     // 载入位图
end;
 
//加载纹理
function LoadGLTextures: Bool;
var
  TextureImage: array [0..0] of PTAUX_RGBImageRec;          // 纹理句柄
begin
  Result := false;
  ZeroMemory(@TextureImage,sizeof(TextureImage));           // 初始化内存
 
  TextureImage[0] := LoadBMP('Data/NeHe.bmp');              // 加载纹理图片
  if Assigned(TextureImage[0]) then
  begin
    Result := 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);    // 生成纹理
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);   // 线形滤波
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);   // 线形滤波
  end;
end;
 
// 重置OpenGL窗口大小
procedure ReSizeGLScene(Width: GLsizei; Height: GLsizei);
begin
  if (Height=0) then                                    // 防止被零除
    Height:=1;                                            // 将Height设为1
 
  glViewport(0, 0, Width, Height);                        // 重置当前的视口(和窗口大小相当)
 
  glMatrixMode(GL_PROJECTION);                            // 指定"投影矩阵堆栈"是下一个矩阵操作的目标
  glLoadIdentity();                                       // 重置当前指定的矩阵为单位矩阵
 
  gluPerspective(45.0,Width/Height,0.1,100.0);            // 设置视口的大小
 
  glMatrixMode(GL_MODELVIEW);                             // 指定"模型视图矩阵堆栈"是下一个矩阵操作的目标
  glLoadIdentity;                                         // 重置当前指定的矩阵为单位矩阵
end;
 
// 初始化OpenGL所有设置
function InitGL:bool;
begin
  if not LoadGLTextures then                        // 加载纹理
  begin
    Result := false;
    exit;
  end;
  glEnable(GL_TEXTURE_2D);                          // 启用纹理映射
 
  glShadeModel(GL_SMOOTH);                       // 采用光滑着色(绘制指定两点间其他点颜色时使用过渡色)
 
  glClearColor(0.0, 0.0, 0.0, 0.5);                // 指定清除颜色缓存时
补充:综合编程 , 其他综合 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,