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