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); // 指定清除颜色缓存时
补充:综合编程 , 其他综合 ,