glColor4f( 1.0, 0, 0.0, 0.5 );
glTranslatef(3,0.0,0.0);
glBegin(GL_QUADS);
glVertex4f(-1, 1, 0,1);
glVertex4f( 1, 1, 0,1);
glVertex4f( 1,-1, 0,1);
glVertex4f(-1,-1, 0,1);
glEnd();----------------------------------
请帮看一看.是不是我写法有错呢?
glTranslatef(3,0.0,0.0);
glBegin(GL_QUADS);
glVertex4f(-1, 1, 0,1);
glVertex4f( 1, 1, 0,1);
glVertex4f( 1,-1, 0,1);
glVertex4f(-1,-1, 0,1);
glEnd();----------------------------------
请帮看一看.是不是我写法有错呢?
解决方案 »
- 请推荐几款代码混乱器,delphi可用的,谢谢
- 有谁用过三方的DBGridEH吗?如何把Footer(脚注)调高
- 请教高手,关于身份验证的问题
- Memo 滚动问题?
- 请教:我在运行Delphi程序时,为什么总是出现CPU Thread窗体?是什么原因导致这种结果?
- 求傣文输入法
- 如何快速对一组maskedit进行条件判断???
- 做html的帮助,怎么点击按钮弹出特定的html文件阿
- dbgrid如何清除内容!THANKYOU!!
- 在DELPHI中能用ADO连接远程有固定IP的数据库服务器上的数据库吗?怎么连接?
- (急) flash播放器中如何实现有文件播放列表,供用户选择播放;
- TStringList属于哪类组件?在线等。。。急
∧ ∧ ∧ ∧
// 红色 黄色 蓝色 透明值
glDisable(GL_DEPTH_TEST); // 关闭深度测试
glBlendFunc(GL_SRC_ALPHA, GL_ONE); // 基于源象素alpha通道值的半透明混合函数试试
绝大多数人都认为Alpha分量代表材料的透明度。这就是说,alpha值为0.0时所代表的材料是完全透明的。alpha值为1.0时所代表的材料则是完全不透明的。混色的公式如下:
(Rs Sr + Rd Dr, Gs Sg + Gd Dg, Bs Sb + Bd Db, As Sa + Ad Da)
OpenGL按照上面的公式计算这两个象素的混色结果。小写的s和r分别代表源象素和目标象素。大写的S和D则是相应的混色因子。这些决定了您如何对这些象素混色。绝大多数情况下,各颜色通道的alpha混色值大小相同,这样对源象素就有 (As, As, As, As),目标象素则有1, 1, 1, 1) - (As, As, As, As)。上面的公式就成了下面的模样:
(Rs As + Rd (1 - As), Gs As + Gd (1 - As), Bs As + Bs (1 - As), As As + Ad (1 - As))
这个公式会生成透明/半透明的效果。OpenGL中的混色
在OpenGL中实现混色的步骤类似于我们以前提到的OpenGL过程。接着设置公式,并在绘制透明对象时关闭写深度缓存。因为我们想在半透明的图形背后绘制 对象。这不是正确的混色方法,但绝大多数时候这种做法在简单的项目中都工作的很好。
正确的混色过程应该是先绘制全部的场景之后再绘制透明的图形。并且要按照与深度缓存相反的次序来绘制(先画最远的物体)。
考虑对两个多边形(1和2)进行alpha混合,不同的绘制次序会得到不同的结果。(这里假定多边形1离观察者最近,那么正确的过程应该先画多边形2,再画多边形1。正如您再现实中所见到的那样,从这两个<透明的>多边形背后照射来的光线总是先穿过多边形2,再穿过多边形1,最后才到达观察者的眼睛。)
在深度缓存启用时,您应该将透明图形按照深度进行排序,并在全部场景绘制完毕之后再绘制这些透明物体。否则您将得到不正确的结果。我知道某些时候这样做是很令人痛苦的,但这是正确的方法。