我目前正在研究this研究论文中描述的算法,但是我遇到了一部分,我不清楚它是如何实现的。
通过将摄像机放置在场景上方并调整其视锥体以包围要被体素化的区域来定义网格。此相机具有相关的视口,其尺寸为(w,h)。然后渲染场景,在帧缓冲器中构建体素化。像素(i,j)表示网格中的列,并且该列内的每个体素使用像素的RGBA值的第k位进行二进制编码。因此,对应的图像表示每个体素具有一位信息的w×h×32网格。该位指示基元是否通过单元。对应于所有像素的第k位的体素的并集定义了切片。因此,编码网格的图像/纹理称为切片图。当基元被光栅化时,获得一组片段。 使用片段着色器以根据其深度确定片段在列中的位置。然后将结果与帧缓冲区的当前值进行“或”运算。
大概有人会通过将blend equation设置为使用二进制OR来实现这一点,但这不是一个可用的选项,我无法通过操纵glBlendFunc()
+ {来看到实现它的方法{1}}
另外根据我的理解,不可能在片段着色器中读取帧缓冲区。您可以将纹理绑定到着色器和帧缓冲区,但是由于缺少同步,在着色器中访问它是undefined behaviour。
本文未说明是否使用了OpenGL或Direct-X,但best of my understanding它具有相同的glBlendEquation()
限制。
我错过了什么吗?
我意识到我可以在32次传球中获得相同的结果。
答案 0 :(得分:2)
OpenGL具有单独的glLogicOp()
,用于对帧缓冲区执行逻辑运算。
可以使用
配置和启用此功能glLogicOp(GL_OR);
glEnable(GL_COLOR_LOGIC_OP);
虽然标志为GL_COLOR_LOGIC_OP
,但文档暗示这也将涵盖alpha值。
在引文26
中描述稍微好一点