c++ - 光能传递全局照明阴影边缘抖动,不直

标签 c++ opengl graphics 3d lighting

我正在实现光能传递照明技术。我有一些静态场景,我想预先计算,然后在其中显示和移动。所以不是实时的,但必须在手机上工作。 因此几何体被分割并且光线反弹,但阴影边缘看起来很糟糕:

pic

使用三角形分割几何图形:

the pic with the triangulation

由于它们的边缘没有沿着阴影对齐,所以看起来不太好。互联网上的样本没有这个(虽然有些有)。所以我可能遗漏了一些东西。

也许我应该找到阴影边缘并强制三角测量以沿着这些边缘创建线条。但要找到它们并不容易,它们可能具有复杂的形状,并且可能有很多灯,进一步增加了三角测量限制的数量。更密集的三角测量不太可能有帮助(尝试过),边缘抖动的规模会更小,但更强烈。如果创建更多的三角形并且输出模糊,它会有所帮助。但由于这是光能传递,增加三角形的数量会极大地影响性能。图片中的场景非常简单,非常适合演示,但我们需要(并且拥有)更复杂的场景/ View ,包括模型、3D 透视图等。 显示的三角形实际上进一步 segmentation 为四个,以便更好的颜色插值,但这些是光反射的单位。

最佳答案

您无法从稀疏镶嵌的几何体中获得硬阴影。因此,如果您有一个应该生成硬阴影的点光源:

  • 应用您的光能传递算法。
  • 从解决方案中减去直接光,这样它就只有间接光的贡献。
  • 渲染场景时,使用光能传递解决方案实现间接照明,并使用经典技术(例如高分辨率阴影贴图)实现硬阴影。

或者,您确实可以执行自适应 segmentation 。请参阅GPU Gems 2. Chapter 39. Global Illumination Using Progressive Refinement Radiosity#Adaptive Subdivision松散的描述和引用。

关于c++ - 光能传递全局照明阴影边缘抖动,不直,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40460931/

相关文章:

c++ - 我用于渲染随机多边形的代码无法正常工作

r - 在具有 3 个 y 轴的单个图中绘制 4 条曲线

opengl - OpenGL到底是如何进行透视校正线性插值的?

c++ 如果我的程序在 eclipse 上运行它会在 linux 上运行吗?

c++ - 我可以使用 std::copy 复制到 stringstream 中吗

java - 哪种 OpenGL 实现最适合 Java

c++ - 16 位 float 和 GL_HALF_FLOAT

java - 将 ACM 图形窗口转换为图像文件

c++ - 是否可以模拟模板<auto X>?

c++ - 从 'int' 到 'char *' 的无效转换