在OpenGL中渲染*填充*半透明立方体

时间:2011-09-03 12:40:13

标签: opengl transparency

Dunno如何表达我的困惑,但这是我的想法: 具有透明(或半透明)边的立方体实心(填充,填充)立方体。它更像是一个空的玻璃立方体。现在我想要的是一个坚固的填充玻璃立方体。就像一个水晶球,但立方体形状。它们背后的东西看起来有所不同。我如何告诉OpenGL我的几何体被塞满了?如何实现从玻璃的层后面看一些场景的效果?

4 个答案:

答案 0 :(得分:7)

正确的术语是“坚实的”。而你的问题是一个非常重要的问题,并没有简单的原位解决方法。对于简单的假折射来说,最好的方法是渲染一个立方体贴图,其原点位于对象体积中心的对象上,并使用该立方体贴图将对象法线缩放为纹理坐标。如果您希望它看起来更准确,您需要了解光物质相互作用。重新创建光物质相互作用效果的唯一完美准确方法是光线追踪(如果使用差分光线元素,可以称之为光子映射)。

如果要实时渲染结果,使用OpenGL可以得到粗略的近似值。

渲染半透明实体需要以某种方式类似于

的光学效应
  • 折射
  • 反射
  • 吸收 - 当光线通过固体时,它将被过滤掉
  • 荧光 - 例如,如果阳光,或只是紫光穿过一片uranium glass,紫外线部分会引起绿色荧光。光线的蓝色部分被吸收,但是你会从玻璃上发出绿色部分。
  • 散射 - 玻璃中的小颗粒,杂质,小气泡等将光散射出去。雾就是这样。

在大多数情况下,足以伪造折射和吸收。玻璃可以非常有效地呈现。渲染折射吸收固体有三个重要变量:

  • 入射光线的入射角度(这隐含地确定了固体内的光线)
  • 材料的想法
  • 射线的出射角度

有几种方法可以获得这些:

  • 您可以预先计算它们,将它们存储为一组球形谐波系数,用作着色器中的附加采样器输入。
  • 您可以使用深度剥离将有问题的对象切割成曲面图层。奇数编号的图层是入口,偶数编号是退出。你从近到远。近表面撞击会折射光线,您可以跟踪该光线,直到它撞击出射面并再次折射出去。射线的长度用作参数,例如,比尔 - 朗伯定律吸收方程。

那么如何在OpenGL中实现它呢?我担心Stackoverflow上的答案将无法覆盖它,除非它成长为一张完全成熟的论文。因此,我推荐您参阅 GPU Gems 2 的第19章,其中涵盖了基础知识http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter19.html

答案 1 :(得分:3)

您正在尝试实现折射效果。在一般情况下,这不是一个小问题,书籍和网上都有大量的技术。

对于立方体,具体而言,您可以分析地计算折射并在渲染每个面时应用合适的变换(您必须根据投射穿过它的一个或多个面向后的刻面细分每个正面刻面;然后您必须弄清楚立方体后面的场景将如何通过每个细分折射)。这是一个很糟糕的解释,但我担心的是一个恰当的解释。对不起,我无法提供帮助,但我希望这足以让你走上正轨。

答案 2 :(得分:0)

实现所需内容的一种简单方法是将立方体的正面渲染为透明面,其中alpha值越大,立方体越厚。这对于来自观察者的矢量通过前侧和前侧的立方体的相对侧的像素仅可接受地起作用。如果通过相邻的立方体边看到像素,则需要进行一些着色器数学运算来计算正确的不透明度。

答案 3 :(得分:0)

您可以尝试在顶部/底部,左/右和前/后面之间绘制许多透明方块。这样,被更多立方体遮挡的东西将在更透明的层后面,因此不那么明显。