OpenGL中,透明度和深度之间的冲突如何解决?

casia1202 2005-04-02 06:14:14
我现在作一个场景,里面树木的贴图使用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();
...全文
455 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangziz 2005-04-06
  • 打赏
  • 举报
回复
在简单的较小的程序里面要达到目的,打开BLEND,关闭DEPTH_TEST
是可以的。
chijingde 2005-04-04
  • 打赏
  • 举报
回复
好久没用了

是不是这样我忘记了

说错了别笑话我哈
chijingde 2005-04-04
  • 打赏
  • 举报
回复
画需要透明的时候打开BLEND,关闭DEPTH_TEST

画其他的时候关闭BLEND,打开DEPTH_TEST
wangziz 2005-04-03
  • 打赏
  • 举报
回复
每个3角形的点是可以取到的,那你就把每个物体的所有3角形排序。
Diab1o 2005-04-02
  • 打赏
  • 举报
回复
首先对要渲染的表面进行排序,先渲染不透明的表面,把需要透明渲染的表面放到后面。另外较远的物体如果比较近的物体后渲染,会因为深度值检测失败而被OpenGL忽略,所以透明渲染时要关闭深度值写入glDepthMask(0)。
casia1202 2005-04-02
  • 打赏
  • 举报
回复
关键就是没法确定远近的物体,因为是立体场景,远近是随时变化的。
还有,应该不是glBendFunc的参数问题,alpha值也没问题。
要是能贴图我就能把渲染的效果贴出来了
syy64 2005-04-02
  • 打赏
  • 举报
回复
1、glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);有很多参数,试试别的参数;
2、a值的设置。
wangziz 2005-04-02
  • 打赏
  • 举报
回复
对于透明的东西,要先画远的物体,最好是写两个函数一个比较远近,一个排序,从远画到近。
这样的话,打开这两个glEnable(GL_BLEND);glEnable(GL_DEPTH_TEST)的情况下就不会有问题。

4,450

社区成员

发帖
与我相关
我的任务
社区描述
图形图像/机器视觉
社区管理员
  • 机器视觉
  • 迪菲赫尔曼
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧