繁体   English   中英

使用帧缓冲区 Object (FBO) 或?

[英]Off-screen multiple render targets using Frame Buffer Object (FBO) or?

情况:生成具有不同变换和旋转的形状和相应边缘的 N 个样本(使用 Sobel 滤波器或我自己的),而视口(大小 = 600 * 600)和相机保持不变。 即将有 N 个样本 + N 个对应的边。

我想这样做,

使用一个带有 2 个渲染缓冲区的 FBO [即每个缓冲区的大小将为 = (N *600) * 600]- N 个形状的第一个和相应形状的边缘的第二个

问题:

  1. 实现上述目标的最佳方法是什么?
  2. 虽然视口大小为 600*600 像素,但形状仅占 50*50 像素左右。 那么是否有任何有效的方法可以仅在第二个缓冲区上对边界框/AABB 区域应用边缘检测? 也只能以有效的方式读取 2N 个边界框(N 个样本 + N 个对应边)?

1:我不确定你所说的“最佳方式”。 使用多个渲染目标:您创建两个 600*N 纹理,使用 glDrawArrays 将它们都绑定到 FBO,并在您的片段着色器中,如下所示:

layout(location = 0) out vec3 color;
layout(location = 1) out vec3 edges;

写入“颜色”和“边缘”时,您将有效地写入纹理。

2:你不应该这样做。 在 CPU 上计算您的边界框,并投影它们(即将每个角乘以您的 ModelViewProjection 矩阵)以获得 2D 的边界框

顺便说一句:首先计算你的边界框,这样你就不需要 600*600 的纹理,而是 50*50...

编辑:您通常使用 glViewPort 限制绘制区域。 但是只有一个视口,你需要几个。 您可以尝试Viewport 数组扩展并生活在最前沿,或者在纹理中传递 AABB,或者在性能重要之前不要担心......

哦,你不能像那样使用 Sobel……Sobel 要求你可以读取周围的所有纹素,但事实并非如此,因为你当前正在渲染所述纹素。 要么制作一个没有 MRT 的两遍算法(第一个颜色,然后是边缘),要么不使用 Sobel 并猜测你在着色器中的边缘(我真的不知道如何)

就像 Calvin 所说,您必须首先将 object 渲染到第一个帧缓冲区中,然后将其绑定为纹理(使用纹理附件而不是渲染缓冲区)以进行第二遍查找边缘,因为边缘检测通常需要访问像素的周围的像素。

关于您的第二个问题,您可能可以使用模板缓冲区。 只需在第一遍中绘制您的形状,然后让它们将参考值写入模板缓冲区。 然后进行边缘检测(通常通过使用相应的片段着色器渲染屏幕大小的四边形)并将模板测试配置为仅在模板缓冲区包含参考值的地方通过。 这种方式(假设 early-z 硬件,现在很常见)片段着色器将仅在实际绘制形状的像素上执行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM