如何仅在特定像素颜色上绘制多边形?

时间:2012-09-12 14:35:19

标签: c++ opengl

我在屏幕上绘制了多个不同颜色的多边形,现在我必须绘制另一个不同颜色的多边形,但是这个多边形应该仅绘制在具有特定颜色的像素上。

我在他们自己的“层”中同时渲染每个不同颜色的多边形,(=一次一种颜色)。他们可以互相掩饰;最新层覆盖所有以前的图层。图像中的黑色是“无多边形”区域:空白区域,它也应该忽略它。

所以,基本上我只是渲染多边形,然后第N个(不是第一个)多边形层必须用下一个多边形图层进行遮罩,其下的任何其他东西都不应该受到影响。

所需方法的图片:

enter image description here

使用OpenGL可以使用哪种方法来实现这一目标?如果可能的话,我更喜欢非着色解决方案(?)。

我目前唯一可以做的方法是将每个图层分别渲染到内存中,然后自己查看像素并“手动”组合图层,但这似乎是一个非常慢的方法,但是可行但是速度在这里很重要。

1 个答案:

答案 0 :(得分:4)

要使用模板缓冲区,您可以做的是:

确保您请求具有模板缓冲区的上下文,这是特定于窗口系统的,因此我不会在此处介绍它。调用glGet(GL_STENCIL_BITS)以确保获得足够的位数。

模板缓冲区在每个像素旁边保持一个整数,并允许您在绘制事物时对其进行修改。绘制每个图层时,设置模板缓冲区以在绘制每个图层时设置为特定值。你这样做

 //draw layer N
 glEnable(GL_STENCIL_TEST);
 glStencilFunc(GL_ALWAYS, N, -1); 
 glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);

现在绘制每个图层时,绘制到屏幕的最后一个多边形也会将它的图层编号存储到模板缓冲区中。

此时,当您想要返回并绘制绿色星形时,您只需告诉它仅绘制模板缓冲区等于N的像素。

 //draw only where stencil == N
 glEnable(GL_STENCIL_TEST);
 glStencilFunc(GL_EQUAL, N, -1);
 glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
 drawStar();