在OpenGL中渲染透明对象

3

我正在尝试使用OpenGL渲染一些3D对象。要求是隐藏所有在另一个透明物体后面的透明物体。所有三角形都在单个三角形缓冲区中,并将一次性绘制。请给予一些提示。


你能否评论一下你的对象是如何透明化的,以及你正在处理哪个版本的OpenGL? - masebase
我正在处理OpenGL 1.1..例如,房间内有一些玻璃花瓶,房间还有玻璃门。用户应该只能通过玻璃门看到房间内的不透明物体,如木制家具,但不能看到房间内的玻璃花瓶。 - user942502
2个回答

5
尝试使用glDepthMask()函数:
    //Render all opaque objects
    glDepthMask(false); //disable z-testing
    //Render all transparent objects*
    glDepthMask(true); //enable z-testing (for the next frame)

从技术上讲,你应该按照从后往前的顺序呈现透明物体,但如果不这样做,通常不容易被注意到。


3

要正确实现透明效果,您需要对场景进行排序。

以下是具体步骤:

  1. 启用深度缓存写入和测试
  2. 渲染所有不透明物体
  3. 按顺序渲染所有透明物体,优先显示前面的透明物体。深度缓存会防止后面的透明物体显示在前面的透明物体后面。

谢谢回复。是的,我可以通过对透明三角形(从前往后)进行排序来实现这一点。但是所有透明对象的三角形都会一次性绘制。当我旋转场景时,效果应该保持不变。不幸的是,由于我正在处理场景中的数十万个三角形,所以无法进行排序。您认为我能否使用某种混合功能组合来实现这一点? - user942502
我不确定这是否可行,至少在OpenGL 1.1功能上是不可能的。你能将其分成两个缓冲区吗? - geofftnz
不,我不能将其分成两个缓冲区,因为在我的三角形缓冲区中,我没有对哪些三角形组成花瓶,哪些三角形组成门进行分类。 - user942502
2
只是出于兴趣,为什么在其他透明物体后面的透明物体不应该显示出来? - geofftnz
我想要一个类似于CATIA实现的透明效果。是的,我已经研究过NVIDIA的双重深度剥离算法了。如果它足够快的话,可能会有所帮助。 - user942502
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接