在这一课里,我们在纹理的基础上加上了混合,它看起具有透明的效果。
         具体的理论资料大家如果有兴趣可以看一下《交互式计算机图形学-基于OpenGL的自顶向下的设计方法》第四版的第381页-383页。上面叙述的很清楚。这里暂时将代码粘在这,以后有时间的话用到的地方我会简单的做些说明。
 
       为了和Nehe的教程保持一致,这里我采用的是Nehe教程中的纹理映射图像,glass.bmp(附件的源码中有),并且这里我对Nehe的教程进行了扩展,你可以看到光源和物体的不同位置关系的混合特效。
 

1  在Form构造函数中填入了以下代码

InBlock.gif //启用阴影平滑
InBlock.gifgl.ShadeModel(OpenGL.SMOOTH);
InBlock.gif //黑色背景
InBlock.gifgl.ClearColor(0f, 0f, 0f, 0.5f);
InBlock.gif //设置深度缓存
InBlock.gifgl.ClearDepth(1.0f);
InBlock.gif //启用深度测试
InBlock.gifgl.Enable(OpenGL.DEPTH_TEST);
InBlock.gif //所做的深度测试
InBlock.gifgl.DepthFunc(OpenGL.LEQUAL);
InBlock.gif //告诉系统对测试进行修正
InBlock.gifgl.Hint(OpenGL.PERSPECTIVE_CORRECTION_HINT, OpenGL.NICEST);
InBlock.gif // 全亮度, 50% Alpha 混合
InBlock.gifgl.Color(1f,1f,1f,0.5f);
InBlock.gif // 基于源象素alpha通道值的半透明混合函数
InBlock.gifgl.BlendFunc(OpenGL.SRC_ALPHA,OpenGL.ONE);
 

2  加入以下成员变量

InBlock.gif //混合变量
InBlock.gif bool blend= false;
 

3  加入Key的响应函数,使B键成为混合的开关。

InBlock.gif case Keys.B:
InBlock.gif if (blend) //现在混合状态
InBlock.gif{
InBlock.gif //关闭混合
InBlock.gifgl.Disable(OpenGL.BLEND);
InBlock.gifgl.Enable(OpenGL.DEPTH_TEST);
InBlock.gif
InBlock.gif}
InBlock.gif else
InBlock.gif{
InBlock.gif //开启混合
InBlock.gifgl.Enable(OpenGL.BLEND);
InBlock.gifgl.Disable(OpenGL.DEPTH_TEST);
InBlock.gif
InBlock.gif}
InBlock.gifblend = !blend;
InBlock.gif break;
 

4 最终的执行效果

     1>运行Load完毕

            2>按住K键调整光源深度,可以看到物体亮度增加

 
 

              3>按下B键,开启混合效果,看到这时的效果不明显。

 

       4>按住L键向右侧调整光源,这时能看到如下透视效果

                    5>按下J键向左调整光源可以看到如下效果

                                   6>按住I键向屏幕内侧调整光源这时可以看到如下效果

 
 

                7 >  按住D键向右调整物体可以看到如下效果

 
源代码