5

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

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

所以,基本上我只是渲染多边形,然后多边形的第 N 层(不是第一层)必须被下一个多边形层掩盖,它下面的其他任何东西都不应该受到影响。

所需方法的图像:

在此处输入图像描述

我可以用什么方法来用 OpenGL 实现这一点?如果可能的话,我更喜欢非着色器解决方案(?)。

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

4

1 回答 1

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();
于 2012-09-12T15:11:39.883 回答