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

Ash*_*ary 1 opengl transparency

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

dat*_*olf 7

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

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

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

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

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

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

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

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

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