Opengl 使用帧缓冲区对象(FBO)或?

Opengl 使用帧缓冲区对象(FBO)或?,opengl,rendering,framebuffer,edge-detection,fbo,Opengl,Rendering,Framebuffer,Edge Detection,Fbo,情况:生成具有不同变换和旋转的形状和相应边的N个样本(使用Sobel过滤器或我自己的),而视口(大小=600*600)和摄影机保持不变。i、 e.将有N个样本+N个对应边 我想这样做, 使用一个带2个渲染缓冲区的FBO[即每个缓冲区的大小为=(N*600)*600]-第一个用于N个形状,第二个用于相应形状的边缘 问题: 实现上述目标的最佳方式是什么 虽然视口大小为600*600像素,但形状仅占50*50像素左右。那么,是否有任何有效的方法仅在第二个缓冲区的边界框/AABB区域上应用边缘检测?是否

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

我想这样做,

使用一个带2个渲染缓冲区的FBO[即每个缓冲区的大小为=(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;
    
    当写入“颜色”和“边缘”时,您将有效地写入纹理

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

    顺便说一下:先计算边界框,这样你就不需要600*600纹理,只需要50*50

    编辑:通常使用视口限制绘制的分区。但是只有一个视口,您需要几个视口。你可以尝试和生活在最前沿,或通过一个纹理的AABB,或不担心,直到性能问题


    哦,你不能这样用索贝尔。。。Sobel要求您可以读取周围的所有texel,但事实并非如此,因为您当前正在渲染所述texel。要么在不使用MRT(第一种颜色,然后是边)的情况下使用两遍算法,要么不要在着色器中使用Sobel和guess you Edge(我真的不知道怎么做)

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


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

    @Calvin-谢谢。2-它是“大约”50*50,即会发生变化,因为有时由于透视投影的z变换效应,它可能会更大或更小。所以我不能这么做。我想我们可以做的只是阅读。“加尔文-请考虑我从来没有使用过着色器。”无法使用:布局(位置=0)输出vec3颜色;edge=iif((color[i,j-1]!=color[i,j+1]| |(color[i-1,j]!=color[i+1,j])1:0;布局(location=1)出vec3边;@Calvin-也就是说,如果我能像上面的评论(assessing neighbor)那样做的话,那么就忘了问题(2)现在,我可以使用一个FBO,两个带碎片着色器的纹理缓冲区来实现我的第一个目标?对吗?@Rudi如果你(通过FBO)渲染到同一个纹理(这似乎是合乎逻辑的),你就不能访问纹理中的邻居。因此:在一个FBO中使用1个颜色纹理和1个深度缓冲区渲染你的场景,然后,渲染生成的纹理(在一个简单的四边形中)在另一个FBO中,使用Sobel碎片着色器。更多信息:@Calvin,谢谢!我知道了!现在我想最后一个问题是:D.使用2个FBO或1个FBO和2个纹理哪个更好:首先绘制一个纹理,然后使用此纹理绘制第二个纹理?我的意思是使用glWritePixels更改绘制目标?因为我在很多地方都读到更改FBO是s直到比更改纹理/渲染缓冲区更昂贵吗?@Christian-是否使用一个FBO和两个纹理缓冲区并应用碎片着色器我们可以实现第一个任务的最佳方法?正如Calvin所建议的那样,而不是更改FBO?即一个textrue将具有形状颜色输出,另一个将具有使用碎片着色器的边缘?@Rudi是的,但正如Calvin所说,y你不能在同一个过程中绘制形状和计算边缘,因为边缘检测器需要访问相邻像素。是的。因此我的新评论很有意义,顺便说一句:你不能访问你的邻居,你甚至不知道它是否已经计算过了!