如何在OpenGL中填充行内空间?

时间:2014-05-11 13:02:01

标签: c++ opengl glut

我想在此代码中填充行内的空格。

代码的主要部分:

struct point { float x; float y; };

point a = { 100, 100 }; 
point b = { 0, 200 }; 
point c = { 0, 0 }; 
point d = { 100, 0 }; 

void displayCB(void){
    glClear(GL_COLOR_BUFFER_BIT); 

    DeCasteljau();

    b.x = 200;
    c.x = 200;
    DeCasteljau();

    glFlush();
}

heart

如何用红色填充这颗心(例如)?

1 个答案:

答案 0 :(得分:3)

如果那是你正在寻找的东西,那就没有洪水填充,也没办法写一个,因为帧缓冲区通常不是读/写,你不能在片段之间传递状态。

您通常要做的是将您的形状 - 从其轮廓转换为覆盖内部区域的几何体,然后绘制几何体。

维基百科here描述了Tesselation。耳朵剪裁并不难实现;单调多边形效率更高,但代码更棘手。幸运的是,OpenGL实用程序库(GLU)为您实现了它,并且可以找到免费版本via MESA - 他们甚至将其与其余的OpenGL重新实现分开。有关如何使用它的说明是here

编辑:另见评论。如果您愿意按像素执行此操作,则可以使用禁用反面消除的三角形风扇来增加模板。假设形状是闭合的,那将导致形状内的每个点被绘制奇数次,并且形状外的每个点被绘制偶数次(实际上可能为零)。然后,您可以绘制任何您知道的形状,至少覆盖每个所需像素,并在最低有效位上进行模板测试,以测试奇数/偶数。

(注意我对增量/减量的原始建议和对零的测试假设你的形状很简单,即没有孔,边缘不会自身相交,基本上它假设从内部到无限的任何地方都有一条直线段将完全跨越边界一次; Reto的改进适用于任何奇数交叉将做的规则

模板方法的设置将更便宜,更简单,但实际的绘图成本将更加昂贵。因此,这取决于您期望改变形状的频率和/或像素缓存是否合适。