[英]Off-screen multiple render targets using Frame Buffer Object (FBO) or?
情况:生成具有不同变换和旋转的形状和相应边缘的 N 个样本(使用 Sobel 滤波器或我自己的),而视口(大小 = 600 * 600)和相机保持不变。 即将有 N 个样本 + N 个对应的边。
我想这样做,
使用一个带有 2 个渲染缓冲区的 FBO [即每个缓冲区的大小将为 = (N *600) * 600]- 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.