模具的 OpenGL 修剪/内联轮廓

问题描述

我在模板缓冲区中创建了一个形状(下图中的黑色)。现在我想渲染到后台缓冲区。我希望在模板(红色)的外部像素(例如 4 个像素)上有一个纹理,在其余像素(红色)上有另一个纹理。

我已经阅读了几个涉及缩放的解决方案,但是当没有明显的形状中心时,这将不起作用。

如何获得想要的效果?

creating a new stencil from the outer N pixels of a stencil

解决方法

模板缓冲区非常适合 doing operations on the specific fragments being overlaid onto them。但是,对于需要查看像素而不是 与正在渲染的片段相对应的像素的操作而言,它并不是那么好。为了做轮廓,你必须询问相邻像素的值,这是模板操作不允许的。

因此,如果可以将要测试的模板数据放在非模板格式的图像中(即:彩色图像,可能具有整数纹理格式),那会使事情变得简单得多。您可以通过在片段着色器中直接使用 discard 来实现模板丢弃的效果。由于您可以从纹理中任意获取(只要您不尝试修改它),您可以获取相邻像素并测试它们的值。您可以使用它来识别片段何时靠近边界。

但是,如果您依靠专门的模板操作来构建模板数据本身(如按位操作),那么情况会更加复杂。您将不得不使用 stencil texturing operations,因此您将不得不渲染到具有深度/模板格式的 FBO 纹理。并且您必须对其进行设置以允许您从纹理的模板方面进行读取。这是 OpenGL 4.3 的一项功能。

这有效地将其转换为 8 位无符号整数纹理。这使您可以玩任何需要的游戏。但是如果你想使用模板测试来丢弃片段,你还需要 texture barrier functionality 来允许你从附加到当前 FBO 的图像中读取。但是您不需要实际使用屏障,因为您应该屏蔽模板文字。您只需要 GL 4.5 或 NV/ARB_texture_barrier 扩展即可,它们很普遍。

不管怎样,最大的困难是改变边界的大小。很容易只测试相邻的 9 个像素以查看它是否在边界处。但是边框尺寸越大,每个片段必须测试的像素区域就越大。那时,我建议尝试寻找一种不同的解决方案,该解决方案基于对写入模板缓冲区的模式的一些了解。

也就是说,如果放置模板的渲染操作对形状有一些了解,那么它可以以某种方式计算到形状边缘的距离。这可能需要以包含距离信息的方式构建几何。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...