NeHe的OpenGL教程3(Bang翻译版)
作为第二课的扩展,我将教你如何使用颜色。你将理解两种着色模式,在左图中,三角形用的是光滑着色,四边形用的是平面着色。如下图:program lesson3a;
{
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); // 绘制三角形(逆时针画出来的三角形才是正面朝着我们的)
glColor3f(1.0,0.0,0.0); // 设置当前色为红色
glVertex3f(-1.0,-1.0, 0.0); // 左下顶点(//glVertex 的第一个参数是X坐标,然后依次是Y坐标和Z坐标)
glColor3f(0.0,1.0,0.0); // 设置当前色为绿色
glVertex3f( 1.0,-1.0, 0.0); // 右下顶点
glColor3f(0.0,0.0,1.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单位
glColor3f(0.5,0.5,1.0); // 一次性将当前色设置为蓝色
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;
//处理所有的窗口消息。当我们注册好窗口类之后,程序跳转到这部分代码处理窗口消息
补充:综合编程 , 其他综合 ,