【问题标题】:Rendering a *stuffed* translucent cube in OpenGL在 OpenGL 中渲染一个*填充的*半透明立方体
【发布时间】:2011-09-03 12:40:13
【问题描述】:

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

【问题讨论】:

    标签: opengl transparency


    【解决方案1】:

    正确的术语是“固体”。而且您的问题很重要,并且没有简单的现场解决方法。对于简单的假折射来说,最好的方法是渲染一个立方体贴图,其原点位于对象边界体积的中心,并使用该立方体贴图与缩放为纹理坐标的对象法线。如果你想让它看起来更准确,你需要了解光与物质的相互作用。重现光与物质相互作用效果的唯一完全准确的方法是光线追踪(如果使用微分光线元素,可以称之为光子映射)。

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

    渲染半透明固体需要在某种程度上类似于

    • 折射
    • 反思
    • 吸收 - 当光线穿过固体时,它会被过滤掉
    • 荧光——例如,如果阳光,或者只是紫光穿过一块uranium glass,紫外线部分会导致绿色荧光。光的蓝色部分被吸收,但绿色部分从玻璃中发出。
    • 散射 - 玻璃中的小颗粒、杂质、小气泡等将光线散射出去。这就是雾的作用。

    在大多数情况下,伪造折射和吸收就足够了。玻璃可以以这种方式非常有效地渲染。渲染折射、吸收性固体有 3 个重要变量:

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

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

    • 您可以预先计算它们,将它们存储为一组球面谐波系数,用作着色器中的附加采样器输入。
    • 您可以使用深度剥离将相关对象切成表面层。奇数层为入口,偶数层为出口。你从近到远。近表面命中折射光线,您跟随该光线直到它撞击出射表面并再次将其折射到那里。光线的长度用作参数,例如Beer-Lambert 定律吸收方程。

    那么如何在 OpenGL 中实现这一点。恐怕 Stackoverflow 上的答案将无法涵盖它,除非它成长为一份成熟的论文。因此,我建议您参考 GPU Gems 2 的第 19 章,其中涵盖了基础知识http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter19.html

    【讨论】:

      【解决方案2】:

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

      具体来说,对于立方体,您可以解析计算折射并在渲染每个面时应用合适的变换(您必须根据投影通过它的一个或多个背面面细分每个正面面;然后必须弄清楚立方体后面的场景将如何通过每个细分进行折射)。这是一个糟糕的解释,但恐怕要进行适当的解释。抱歉,我无法提供更多帮助,但我希望这足以让您走上正轨。

      【讨论】:

      • 谢谢回复。是否有一种技术可以包括填充几何形状但避免涉及复杂光学的事实?有点像我不关心光是如何折射的,因为材料的厚度,我只是想表明一个事实,即物体越多,它变得越不透明。对不起,如果我听起来很困惑,那是因为我是!
      • 您可以使用着色器相对于立方体的深度淡化背景,但这看起来像一个均匀雾的立方体,而不是玻璃。
      【解决方案3】:

      实现所需效果的一种简单方法是将立方体的正面渲染为透明面,Alpha 值越大,立方体越厚。这仅适用于从观察者穿过立方体正面和正面相对侧的矢量的像素。如果像素是通过相邻的立方体侧面看到的,则需要进行一些着色器数学运算来计算适当的不透明度。

      【讨论】:

        【解决方案4】:

        您可以尝试在顶/底、左/右和正面/背面之间绘制许多透明方块。这样一来,被更多立方体遮挡的事物将位于更透明的层后面,因此不那么明显。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-08-07
          • 1970-01-01
          • 2018-09-27
          • 1970-01-01
          • 2014-05-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多