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

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


在这一课里,我们把三角形变为立体的金子塔形状,把四边形变为立方体,如下图:
 

\

program lesson5a;
 
{
    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全屏标志缺省,缺省设定成全屏模式
 
  rtri: GLfloat;  // 用于三角形的角度
  rquad: GLfloat; // 用于四边形的角度
 
 
// 重置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
 
  glRotatef(rtri,0.0,1.0,0.0); // 绕Y轴旋转金字塔
 
  glBegin(GL_TRIANGLES); // 开始绘制金字塔的各个面
 
  //下面的代码创建一个绕者其中心轴旋转的金字塔。金字塔的上顶点高出原点一个单位,底面中心低于原点一个单位。上顶点在底面的投影位于底面的中心。
  //注意所有的面-三角形都是逆时针次序绘制的。这点十分重要,在以后的课程中我会作出解释。现在,您只需明白要么都逆时针,要么都顺时针,但永远不要将两种次序混在一起,除非您有足够的理由必须这么做。
  //我们开始画金字塔的前侧面。因为所有的面都共享上顶点,我们将这点在所有的三角形中都设置为红色。底边上的两个顶点的颜色则是互斥的。前侧面的左下顶点是绿色的,右下顶点是蓝色的。这样相邻右侧面的左下顶点是蓝色的,右下顶点是绿色的。这样四边形的底面上的点的颜色都是间隔排列的。
  glColor3f(1.0,0.0,0.0); // 红色
  glVertex3f( 0.0, 1.0, 0.0); // 三角形的上顶点(前侧面)
  glColor3f(0.0,1.0,0.0); // 绿色
  glVertex3f(-1.0,-1.0, 1.0); // 三角形的左下顶点(前侧面)
  glColor3f(0.0,0.0,1.0); // 蓝色
  glVertex3f( 1.0,-1.0, 1.0); // 三角形的右下顶点(前侧面)
 
  //现在绘制右侧面。注意其底边上的两个顶点的X坐标位于中心右侧的一个单位处。顶点则位于Y轴上的一单位处,且Z坐标正好处于底边的两顶点的Z坐标中心。右侧面从上顶点开始向外侧倾斜至底边上。
  //这次的左下顶点用蓝色绘制,以保持与前侧面的右下顶点的一致。蓝色将从这个角向金字塔的前侧面和右侧面扩展并与其他颜色混合。
  //还应注意到后面的三个侧面和前侧面处于同一个glBegin(GL_TRIANGLES) 和glEnd()语句中间。因为我们是通过三角形来构造这个金字塔的。OpenGL知道每三个点构成一个三角形。当它画完一个三角形之后,如果还有
补充:综合编程 , 其他综合 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,