【问题标题】:Binary OR framebuffer blending二进制或帧缓冲混合
【发布时间】:2017-05-24 19:25:38
【问题描述】:

我目前正在研究this 研究论文中描述的算法,但是我遇到了一个我不清楚它是如何实现的部分。

通过将相机放置在场景上方并调整其视锥体以包围要体素化的区域来定义网格。此相机具有 (w, h) 尺寸的关联视口。然后渲染场景,在帧缓冲区中构建体素。像素 (i,j) 表示网格中的一列,并且该列中的每个体素使用像素的 RGBA 值的第 k 位进行二进制编码。因此,相应的图像表示一个 w×h×32 网格,每个体素有一位信息。该位指示原语是否通过信元。对应于所有像素的第 k 位的体素的联合定义了一个切片。因此,编码网格的图像/纹理称为 slicemap 。当一个图元被光栅化时,会得到一组片段。 片段着色器用于根据片段的深度确定片段在列中的位置。然后将结果与帧缓冲区的当前值进行或运算。

大概可以通过将blend equation 设置为使用二进制或来实现这一点,但这不是一个可用的选项,我看不到通过操纵glBlendFunc()+glBlendEquation() 来实现它的方法

此外,据我了解,无法在片段着色器中读取帧缓冲区。您可以将纹理绑定到着色器和帧缓冲区,但是由于缺乏同步,在着色器中访问它是 undefined behaviour

论文没有说明使用的是 OpenGL 还是 Direct-X,但是对于 best of my understanding,它具有相同的 glBlendEquation() 限制。

我错过了什么吗?

我意识到我可以简单地在 32 遍中获得相同的结果。

【问题讨论】:

  • 您引用的段落之前的最后一句指出“体素化方法是 [26] 中描述的 GPU 方法的扩展”。你读过"Fast Scene Voxelization and Applications" paper by Eisemann吗?另一种方法是所描述的方法,例如,here,它使用图像加载/存储操作。
  • 是的,我只是想在发布问题后这样做,它提到了“gl 逻辑操作”,这似乎是我需要的。我在下面发布了答案。

标签: opengl fragment-shader framebuffer


【解决方案1】:

OpenGL 有一个单独的glLogicOp() 用于对帧缓冲区执行逻辑操作。

这可以使用

进行配置和启用
glLogicOp(GL_OR);
glEnable(GL_COLOR_LOGIC_OP);

虽然标志是 GL_COLOR_LOGIC_OP,但文档暗示这也将涵盖 alpha 值。

在引用26中描述得稍微好一点

【讨论】:

猜你喜欢
  • 2015-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-11
  • 2021-08-21
  • 2020-07-13
  • 2010-09-06
  • 2017-09-24
相关资源
最近更新 更多