在 OpenGL 中渲染一个*填充的*半透明立方体
Posted
技术标签:
【中文标题】在 OpenGL 中渲染一个*填充的*半透明立方体【英文标题】:Rendering a *stuffed* translucent cube in OpenGL 【发布时间】:2011-09-03 12:40:13 【问题描述】:不知道如何表达我的困惑,但这是我的想法: 具有透明(或半透明)边的立方体不是实心(填充、填充)立方体。它更像是一个空的玻璃立方体。现在我想要的是一个坚固的填充玻璃立方体。就像一个水晶球,但呈立方体形状。它们背后的东西看起来不同。我如何告诉 OpenGL 我的几何图形已填充?我如何实现从非常厚层(例如玻璃)后面看某个场景的效果?
【问题讨论】:
【参考方案1】:正确的术语是“固体”。而且您的问题很重要,并且没有简单的现场解决方法。对于简单的假折射来说,最好的方法是渲染一个立方体贴图,其原点位于对象边界体积的中心,并使用该立方体贴图与缩放为纹理坐标的对象法线。如果你想让它看起来更准确,你需要了解光与物质的相互作用。重现光与物质相互作用效果的唯一完全准确的方法是光线追踪(如果使用微分光线元素,可以称之为光子映射)。
如果要实时渲染结果,使用 OpenGL 可以获得粗略的近似值。
渲染半透明固体需要在某种程度上类似于
折射 反思 吸收 - 当光线穿过固体时,它会被过滤掉 荧光——例如,如果阳光,或者只是紫光穿过一块uranium glass,紫外线部分会导致绿色荧光。光的蓝色部分被吸收,但绿色部分从玻璃中发出。 散射 - 玻璃中的小颗粒、杂质、小气泡等将光线散射出去。这就是雾的作用。在大多数情况下,伪造折射和吸收就足够了。玻璃可以以这种方式非常有效地渲染。渲染折射、吸收性固体有 3 个重要变量:
入射光线的进入角度(这隐含地确定了实体内的光线) 材料的思想 光线的出射角有几种方法可以获得这些:
您可以预先计算它们,将它们存储为一组球面谐波系数,用作着色器中的附加采样器输入。 您可以使用深度剥离将相关对象切成表面层。奇数层为入口,偶数层为出口。你从近到远。近表面命中折射光线,您跟随该光线直到它撞击出射表面并再次将其折射到那里。光线的长度用作参数,例如Beer-Lambert 定律吸收方程。那么如何在 OpenGL 中实现这一点。恐怕 *** 上的答案将无法涵盖它,除非它成长为一份成熟的论文。因此,我建议您参考 GPU Gems 2 的第 19 章,其中涵盖了基础知识http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter19.html
【讨论】:
【参考方案2】:您正在尝试实现折射效果。在一般情况下,这不是一个微不足道的问题,书籍和网上都有大量可用的技术。
具体来说,对于立方体,您可以解析计算折射并在渲染每个面时应用合适的变换(您必须根据投影通过它的一个或多个背面面细分每个正面面;然后必须弄清楚立方体后面的场景将如何通过每个细分进行折射)。这是一个糟糕的解释,但恐怕要进行适当的解释。抱歉,我无法提供更多帮助,但我希望这足以让您走上正轨。
【讨论】:
谢谢回复。是否有一种技术可以包括填充几何形状但避免涉及复杂光学的事实?有点像我不关心光是如何折射的,因为材料的厚度,我只是想表明一个事实,即物体越多,它变得越不透明。对不起,如果我听起来很困惑,那是因为我是! 您可以使用着色器相对于立方体的深度淡化背景,但这看起来像一个均匀雾的立方体,而不是玻璃。【参考方案3】:实现所需效果的一种简单方法是将立方体的正面渲染为透明面,Alpha 值越大,立方体越厚。这仅适用于从观察者穿过立方体正面和正面相对侧的矢量的像素。如果像素是通过相邻的立方体侧面看到的,则需要进行一些着色器数学运算来计算适当的不透明度。
【讨论】:
【参考方案4】:您可以尝试在顶/底、左/右和正面/背面之间绘制许多透明方块。这样一来,被更多立方体遮挡的事物将位于更透明的层后面,因此不那么明显。
【讨论】:
以上是关于在 OpenGL 中渲染一个*填充的*半透明立方体的主要内容,如果未能解决你的问题,请参考以下文章
在OpenGL中绘制到半透明帧缓冲区时如何抗锯齿? [复制]