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

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

这一课中,我将教您如何创建三角形和四边形。如下图:
 
 \
 
program lesson2a;
 
{
    OpenGL DelphiXE
    出处:根据NeHe代码翻译而来(http://nehe.gamedev.net/)
    作者:帅宏军shuaihj@163.com
}
 
uses
  Windows,
  Messages,
  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绘制代码
  //当您调用glLoadIdentity()之后,您实际上将当前点移到了屏幕中心,
  //X坐标轴从左至右,Y坐标轴从下至上,Z坐标轴从里至外。
  //OpenGL屏幕中心的坐标值是X和Y轴上的0.0f点。
  //中心左面的坐标值是负值,右面是正值。移向屏幕顶端是正值,移向屏幕底端是负值。移入屏幕深处是负值,移出屏幕则是正值。
  glTranslatef(-1.5,0.0,-6.0); // 左移1.5 单位,并移入屏幕6.0
 
  glBegin(GL_TRIANGLES); // 绘制三角形(逆时针画出来的三角形才是正面朝着我们的)
    glVertex3f(-1.0,-1.0, 0.0); // 左下顶点(//glVertex 的第一个参数是X坐标,然后依次是Y坐标和Z坐标)
    glVertex3f( 1.0,-1.0, 0.0); // 右下顶点
    glVertex3f( 0.0, 1.0, 0.0); // 上顶点
  glEnd(); // 三角形绘制结束
 
  //在屏幕的左半部分画完三角形后,我们要移到右半部分来画正方形。
  //这次右移,所以X坐标值为正值。因为前面左移了1.5个单位,
  //这次要先向右移回屏幕中心(1.5个单位),再向右移动1.5个单位。总共要向右移3.0个单位。
  glTranslatef(3.0,0.0,0.0); // 右移3单位
 
  glBegin(GL_QUADS); // 绘制正方形(逆时针画出来的正方形才是正面朝着我们的)
    glVertex3f(-1.0,-1.0, 0.0); // 左下
    glVertex3f( 1.0,-1.0, 0.0); // 右下
    glVertex3f( 1.0, 1.0, 0.0); // 右上
    glVertex3f(-1.0, 1.0, 0.0); // 左上
  glEnd(); // 正方形绘制结束
 
  Result := true;
end;
 
//处理所有的窗口消息。当我们注册好窗口类之后,程序跳转到这部分代码处理窗口消息
function WndProc(hWnd: HWND;                            // 窗口的句柄
                 message: UINT;                         // 窗口的消息
                 wParam:
补充:综合编程 , 其他综合 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,