【发布时间】:2011-09-03 12:40:13
【问题描述】:
不知道如何表达我的困惑,但这是我的想法: 具有透明(或半透明)边的立方体不是实心(填充、填充)立方体。它更像是一个空的玻璃立方体。现在我想要的是一个坚固的填充玻璃立方体。就像一个水晶球,但呈立方体形状。它们背后的东西看起来不同。我如何告诉 OpenGL 我的几何图形已填充?我如何实现从非常厚层(例如玻璃)后面看某个场景的效果?
【问题讨论】:
标签: opengl transparency
不知道如何表达我的困惑,但这是我的想法: 具有透明(或半透明)边的立方体不是实心(填充、填充)立方体。它更像是一个空的玻璃立方体。现在我想要的是一个坚固的填充玻璃立方体。就像一个水晶球,但呈立方体形状。它们背后的东西看起来不同。我如何告诉 OpenGL 我的几何图形已填充?我如何实现从非常厚层(例如玻璃)后面看某个场景的效果?
【问题讨论】:
标签: opengl transparency
正确的术语是“固体”。而且您的问题很重要,并且没有简单的现场解决方法。对于简单的假折射来说,最好的方法是渲染一个立方体贴图,其原点位于对象边界体积的中心,并使用该立方体贴图与缩放为纹理坐标的对象法线。如果你想让它看起来更准确,你需要了解光与物质的相互作用。重现光与物质相互作用效果的唯一完全准确的方法是光线追踪(如果使用微分光线元素,可以称之为光子映射)。
如果要实时渲染结果,使用 OpenGL 可以获得粗略的近似值。
渲染半透明固体需要在某种程度上类似于
在大多数情况下,伪造折射和吸收就足够了。玻璃可以以这种方式非常有效地渲染。渲染折射、吸收性固体有 3 个重要变量:
有几种方法可以获得这些:
那么如何在 OpenGL 中实现这一点。恐怕 Stackoverflow 上的答案将无法涵盖它,除非它成长为一份成熟的论文。因此,我建议您参考 GPU Gems 2 的第 19 章,其中涵盖了基础知识http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter19.html
【讨论】:
您正在尝试实现折射效果。在一般情况下,这不是一个微不足道的问题,书籍和网上都有大量可用的技术。
具体来说,对于立方体,您可以解析计算折射并在渲染每个面时应用合适的变换(您必须根据投影通过它的一个或多个背面面细分每个正面面;然后必须弄清楚立方体后面的场景将如何通过每个细分进行折射)。这是一个糟糕的解释,但恐怕要进行适当的解释。抱歉,我无法提供更多帮助,但我希望这足以让您走上正轨。
【讨论】:
实现所需效果的一种简单方法是将立方体的正面渲染为透明面,Alpha 值越大,立方体越厚。这仅适用于从观察者穿过立方体正面和正面相对侧的矢量的像素。如果像素是通过相邻的立方体侧面看到的,则需要进行一些着色器数学运算来计算适当的不透明度。
【讨论】:
您可以尝试在顶/底、左/右和正面/背面之间绘制许多透明方块。这样一来,被更多立方体遮挡的事物将位于更透明的层后面,因此不那么明显。
【讨论】: