【问题标题】:Drawing a transparent object inside an opaque one在不透明对象内绘制透明对象
【发布时间】:2011-07-04 13:33:59
【问题描述】:

我试图在一个不透明的笼子里画一个透明的物体,但无论我怎么尝试都做不到。

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glClearColor( 0.0f, 0.0f, 0.0f, 0.0f ); 

glDisable(GL_BLEND);

glEnable(GL_DEPTH_TEST);

glEnable(GL_CULL_FACE); 
glCullFace(GL_BACK);

glColor4f(1.0, 1.0, 1.0, 1.0);
drawCage();

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

glColor4f(0.0, 0.0, 0.0, 0.5);
drawObject();   

glPopAttrib();

这使得里面的透明对象出现在前面,尽管它在里面。

我做错了什么,可能与我正在使用的着色器有关

【问题讨论】:

  • 如果这是C代码,添加适当的标签。
  • 一张照片确实不错。
  • 不透明物体中的透明物体”让我什么...?直到我读到不透明物体是笼子。 :)
  • @henryprescott:这个问题有什么进展吗?你让它工作了吗?

标签: c++ opengl programming-languages transparency


【解决方案1】:

一些事情。

  1. 检查初始化中的深度函数以及您的像素格式深度缓冲区。
  2. 先用标准的 gouraud 着色器试试。
  3. 三重检查透明对象的所有顶点是否都在笼子内。
  4. 每帧使用某种摄像机旋转,以便您可以从各个角度看到渲染的场景。 (这样你可以检查你是否不小心将对象从里到外渲染了[当我离开一段时间后回到 3D 时经常发生在我身上])

希望有帮助

【讨论】:

  • 我正在做一些我在原始问题中没有提到的屏幕外渲染,并且因为我没有将深度缓冲区附加到这个 FBO 这导致了问题。我已经给你答案了,因为你的调试技巧似乎是个好主意。
【解决方案2】:

那么你的透明度就没有问题了。如果您启用了深度测试,并且您的对象出现在另一个对象的前面,那么您的几何图形或绘图程序都有问题。可能是一百万件事,请先尝试禁用剔除,然后看看会发生什么。

另一方面,您尝试使用具有 1.0f alpha 的恒定颜色渲染透明对象。这意味着完全不透明。你确定吗?

【讨论】:

  • 对不起,我应该把颜色去掉,因为无论如何它都在这些方法中被改变。几何形状肯定没有问题,禁用背面剔除似乎没有效果。
  • 你的着色器是什么样的?也许您可以发布屏幕截图?
猜你喜欢
  • 2017-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-10
  • 2018-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多