打印本文 打印本文 关闭窗口 关闭窗口
NeHe的opengl教程delphi版(8)----简单的透明
作者:武汉SEO闵涛  文章来源:敏韬网  点击数1896  更新时间:2009/4/23 18:37:36  文章录入:mintao  责任编辑:mintao
;         // 调用纹理载入子例程
      exit;                             // 如果未能载入,退出

   glEnable(GL_TEXTURE_2D);             // 启用纹理映射
   glShadeModel(GL_SMOOTH);             // 启用阴影平滑
   glClearColor(0.0, 0.0, 0.0, 0.0);    // 黑色背景
   glClearDepth(1.0);                   // 设置深度缓存
   glEnable(GL_DEPTH_TEST);             // 启用深度测试
   glDepthFunc(GL_LESS);                // 所作深度测试的类型
   glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); //高度优化的透视投影计算
   glLightfv(GL_LIGHT1, GL_AMBIENT, @LightAmbient[0]); // 设置环境光
   glLightfv(GL_LIGHT1, GL_DIFFUSE, @LightDiffuse[0]); // 设置漫射光
   glLightfv(GL_LIGHT1, GL_POSITION, @LightPosition); // 光源位置
   glEnable(GL_LIGHT1);                 // 启用一号光源

   glColor4f(1.0, 1.0, 1.0, 0.5);       // 全亮度, 50% Alpha 混合( 新增 )
   glBlendFunc(GL_SRC_ALPHA, GL_ONE); // 基于源象素alpha通道值的半透明混合函数 ( 新增 )

End;

 {在接近第七课结尾处的地方找到下面的代码段。
                  If keys[VK_LEFT] Then    //Left方向键按下了么?
                  yspeed := yspeed - 0.01; //若是, 减少yspeed
                接着上面的代码,我们增加如下的代码。
                这几行监视B键是否按下。
                如果是的话,计算机检查混合选项是否已经打开。
                然后将其置为相反的状态。
                }
               If (keys[ord(''''B'''')] And Not bp) Then //B 健按下且bp为 FALSE么?
                  Begin
                     bp := TRUE;        // 若是, bp 设为 TRUE
                     blend := Not blend; // 切换混合选项的 TRUE / FALSE
                     If (blend) Then    // 混合打开了么?
                        Begin
                           glEnable(GL_BLEND); // 打开混合
                           glDisable(GL_DEPTH_TEST); // 关闭深度测试
                        End
                     Else               // 否则
                        Begin
                           glDisable(GL_BLEND); // 关闭混合
                           glEnable(GL_DEPTH_TEST); // 打开深度测试
                        End;
                  End;
               If (Not keys[ord(''''B'''')]) Then //  B 键松开了么?
                  Begin
                     bp := FALSE;       // 若是, bp设为 FALSE
                  End;
               {
               但是怎样才能在使用纹理贴图的时候指定混合时的颜色呢?很简单,
               在调整贴图模式时,文理贴图的每个象素点的颜色都是由alpha通道参数
               与当前地象素颜色相乘所得到的。
               比如,绘制的颜色是 (0.5, 0.6, 0.4),
               我们会把颜色相乘得到(0.5, 0.6, 0.4, 0.2)
                (alpha参数在没有指定时,缺省为零)。
               就是如此!OpenGL实现Alpha混合的确很简单!
               }
               {
                原文注 (11/13/99)
                我(NeHe)混色代码进行了修改,以使显示的物体看起来更逼真。
                同时对源象素和目的象素使用alpha参数来混合,会导致物体的人造痕迹看起来很明显。
                会使得物体的背面沿着侧面的地方显得更暗。
                基本上物体会看起来很怪异。
                我所用的混色方法也许不是最好的,但的确能够工作。
                启用光源之后,物体看起来很逼真。
                感谢Tom提供的原始代码,他采用的混色方法是正确的,
                但物体看起来并不象所期望的那样吸引人:)
                代码所作的再次修改是因为在某些显卡上glDepthMask()函数存在寻址问题。
                这条命令在某些卡上启用或关闭深度缓冲测试时似乎不是很有效,
                所以我已经将启用或关闭深度缓冲测试的代码转成老式的glEnable和glDisable。

                纹理贴图的Alpha混合
                用于纹理贴图的alpha参数可以象颜色一样从问题贴图中读取。
                方法如下,您需要在载入所需的材质同时取得其的alpha参数。
                然后在调用glTexImage2D()时使用GL_RGBA的颜色格式。
               }

 

 

//运行一下看看效果

上一页  [1] [2] 

打印本文 打印本文 关闭窗口 关闭窗口