使用帧缓冲区对象(FBO)进行屏幕外多个渲染目标,还是?

| 情况:生成N个形状和相应边缘(使用Sobel滤镜或我自己的)的样本,它们具有不同的变换和旋转,而视口(大小= 600 * 600)和相机保持不变。即将有N个样本+ N个对应的边。 我在想这样做 将一个FBO与2个渲染缓冲区一起使用[即每个缓冲区的大小将为=(N * 600)* 600]-N个形状的第一个,对应形状的边缘的第二个 问题: 达到上述目标的最佳方法是什么? 尽管视口大小为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;
写入\“ color \”和\“ edges \”时,您将有效地写入纹理。 2:您不应该这样做。计算CPU上的边界框,然后对其进行投影(即,将每个角乘以您的ModelViewProjection矩阵)以获取2D边界框 顺便说一句:首先计算边界框,这样就不需要600 * 600的纹理,而是50 * 50的... 编辑:您通常使用glViewPort限制绘制区域。但是,这只是一个视口,您需要多个视口。您可以尝试使用Viewport数组扩展并使用最新技术,或者在纹理中传递AABB,或者在性能很重要之前不必担心... 哦,您不能那样使用Sobel ... Sobel要求您可以读取周围的所有纹理像素,情况并非如此,因为您当前正在渲染所述纹理像素。做出没有MRT(第一种颜色,然后是边缘)的两遍算法,或者不使用Sobel并猜测您在着色器中的边缘(我真的不知道如何)     
        就像Calvin所说的那样,您必须首先将对象渲染到第一个帧缓冲区中,然后将其绑定为纹理(使用纹理附件而不是渲染缓冲区)进行第二遍查找边缘,因为边缘检测通常需要访问像素\的周围像素。 关于第二个问题,您可能可以使用模板缓冲区。只需在第一遍中绘制形状,然后让它们将参考值写入模板缓冲区即可。然后进行边缘检测(通常通过使用相应的片段着色器渲染屏幕大小的四边形)并将模板测试配置为仅通过模板缓冲区包含参考值的地方。这样(假设早期的z硬件现在很常见),片段着色器将仅在实际绘制形状的像素上执行。     

要回复问题请先登录注册