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

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

在这个教程里,我将教你在Windows环境中创建OpenGL程序.它将显示一个空的OpenGL窗口,可以在窗口和全屏模式下切换,按ESC退出.它是我们以后应用程序的框架。如下图:
 
 \
 
program lesson1a;
 
{
    OpenGL DelphiXE
    出处:根据NeHe代码翻译而来(http://nehe.gamedev.net/)
    作者:帅宏军shuaihj@163.com
}
 
uses
  Windows,
  Messages,
  // 引用OpenGL单元
  OpenGL;
 
// 全局变量
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全屏标志缺省,缺省设定成全屏模式
 
// 重置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
  glShadeModel(GL_SMOOTH);                       // 采用光滑着色(绘制指定两点间其他点颜色时使用过渡色)
 
  glClearColor(0.0, 0.0, 0.0, 0.5);                // 指定清除颜色缓存时使用的颜色值(黑色,0.5透明)
 
  glClearDepth(1.0);                            // 指定清除深度缓存时使用的深度值
  glEnable(GL_DEPTH_TEST);                       // 启用深度测试,对深度缓存中符合"深度比较算法"要求的像素进行重绘
  glDepthFunc(GL_LEQUAL);                        // 指定"深度比较算法"
 
  glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST); // 告诉系统对透视进行最高质量修正
 
  Result:=true;
end;
 
// 绘制OpenGL场景(任何您所想在屏幕上显示的东东都将在此段代码中出现)
function DrawGLScene():bool;
begin
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);  // 根据glClearColor和glClearDepth指定的值清除颜色和深度缓存
  glLoadIdentity();                                     // 重置当前指定的矩阵为单位矩阵
 
  //你自己的OpengGL绘制代码
  //......
 
  Result := true;
end;
 
//处理所有的窗口消息。当我们注册好窗口类之后,程序跳转到这部分代码处理窗口消息
function WndProc(hWnd: HWND;                            // 窗口的句柄
                 message: UINT;                         // 窗口的消息
                 wParam: WPARAM;                        // 附加的消息内容
                 lParam: LPARAM):                       // 附加的消息内容
                                  LRESULT; stdcall;
var
  scrWidth,scrHeight: integer;
  rect: TRect;
begin
  if message=WM_SYSCOMMAND then                         // 监视系统中断命令
    begin
      case wParam of
        SC_SCREENSAVE,SC_MONITORPOWER:                  // 屏保要运行或显示器要进入节电模式
          begin
     &
补充:综合编程 , 其他综合 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,