OpenGL中,透明度和深度之间的冲突如何解决?
我现在作一个场景,里面树木的贴图使用mask和blend,以实现部分透明。但我如果去掉深度检测,就会把后面的面显示到前面来。可是加上深度检测,贴图就只对部分对象是透明的,对某些面却是完全遮挡的,请问如何解决?
代码如下,其中纹理是RGBA格式。如果有好几个这种方块就会发生遮挡,就是说应当透明的部分遮住了后面的物体。
glEnable(GL_BLEND);
glEnable(GL_DEPTH_TEST);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glBindTexture(GL_TEXTURE_2D, textureID);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.5f, -1.1f, 0.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 0.5f, -1.1f, 0.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 0.5f, 1.1f, 0.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.5f, 1.1f, 0.0f);
glEnd();
问题点数:0、回复次数:8Top
1 楼wangziz(zi)回复于 2005-04-02 19:45:06 得分 0
对于透明的东西,要先画远的物体,最好是写两个函数一个比较远近,一个排序,从远画到近。
这样的话,打开这两个glEnable(GL_BLEND);glEnable(GL_DEPTH_TEST)的情况下就不会有问题。Top
2 楼syy64(太平洋)回复于 2005-04-02 20:10:22 得分 0
1、glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);有很多参数,试试别的参数;
2、a值的设置。Top
3 楼casia1202(B哥)回复于 2005-04-02 21:39:27 得分 0
关键就是没法确定远近的物体,因为是立体场景,远近是随时变化的。
还有,应该不是glBendFunc的参数问题,alpha值也没问题。
要是能贴图我就能把渲染的效果贴出来了Top
4 楼Diab1o(菠萝)回复于 2005-04-02 21:45:59 得分 0
首先对要渲染的表面进行排序,先渲染不透明的表面,把需要透明渲染的表面放到后面。另外较远的物体如果比较近的物体后渲染,会因为深度值检测失败而被OpenGL忽略,所以透明渲染时要关闭深度值写入glDepthMask(0)。Top
5 楼wangziz(zi)回复于 2005-04-03 00:13:04 得分 0
每个3角形的点是可以取到的,那你就把每个物体的所有3角形排序。Top
6 楼chijingde(AD)回复于 2005-04-04 23:13:05 得分 0
画需要透明的时候打开BLEND,关闭DEPTH_TEST
画其他的时候关闭BLEND,打开DEPTH_TESTTop
7 楼chijingde(AD)回复于 2005-04-04 23:14:04 得分 0
好久没用了
是不是这样我忘记了
说错了别笑话我哈Top
8 楼wangziz(zi)回复于 2005-04-06 00:18:15 得分 0
在简单的较小的程序里面要达到目的,打开BLEND,关闭DEPTH_TEST
是可以的。
Top




