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

Roo*_*kie 5 c++ opengl

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

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

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

所需方法的图片:

在此输入图像描述

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

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

Tim*_*Tim 4

要为此使用模板缓冲区,您可以执行以下操作:

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

模板缓冲区在每个像素旁边维护一个整数,并允许您在绘制内容时对其进行修改。绘制每个图层时,将模板缓冲区设置为绘制每个图层时的特定值。你这样做

 //draw layer N
 glEnable(GL_STENCIL_TEST);
 glStencilFunc(GL_ALWAYS, N, -1); 
 glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
Run Code Online (Sandbox Code Playgroud)

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

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

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