OpenGL填充多边形颜色“出血”

Posted

技术标签:

【中文标题】OpenGL填充多边形颜色“出血”【英文标题】:OpenGL filled polygon color "bleeding" 【发布时间】:2011-04-13 20:26:37 【问题描述】:

我正在尝试在 openGL (Java) 中绘制一个 5 尖星形状,该形状既填充又轮廓。我用来绘制它的代码

gl.glPushAttrib(GL.GL_ALL_ATTRIB_BITS);
try 
   // set attributes for filling the shape
   Color fillColor = Color.GREEN;
   float[] rgb = fill.getRGBColorComponents(null);
   gl.glColor4f(rgb[0], rgb[1], rgb[2], 1f);
   gl.glEnable(GL.GL_POLYGON_SMOOTH);
   gl.glPolygonMode(GL.GL_FRONT_AND_BACK, GL.GL_FILL);                    
   gl.glEnable(GL.GL_POLYGON_OFFSET_FILL);
   gl.glCallList(this.glListId);

   // set attributes for outlining the shape
   gl.glEnable(GL.GL_LINE_SMOOTH);
   Color outline = Color.RED;
   float[] rgb = outline.getRGBColorComponents(null);
   gl.glColor4f(rgb[0], rgb[1], rgb[2], 1f);
   gl.glPolygonMode(GL.GL_FRONT_AND_BACK, GL.GL_LINE);
   gl.glLineWidth(5);                 
   gl.glCallList(this.glListId);

finally 
    gl.glPopAttrib();

调用列表的创建如下:

gl.glNewList(this.glListId, GL.GL_COMPILE);
gl.glBegin(GL.GL_POLYGON);
for (int j = 0; j < xCoords.length; j++) 
   // 2d polygon
   gl.glVertex2d(xCoords[j], yCoords[j]);

gl.glEnd();

当我这样做时,星星的轮廓绘制得很完美,但填充颜色在轮廓边缘之外溢出(如果我在没有轮廓的情况下绘制它,多边形看起来也不清晰)。任何想法为什么?

编辑:我添加了一个显示问题的屏幕截图

谢谢, 杰夫

【问题讨论】:

你试过用简单的GL_TRIANGLE_FAN吗? 我也可以用三角扇做轮廓吗?我在想,如果我这样做,那么轮廓将显示所有内部三角形...... @Jeff:不,您可以使用单个 GL_LINE_STRIP 绘制轮廓并忽略该调用的第一个顶点。 GL_TRIANGLE_FAN 需要一个额外的顶点作为中心。你不必在同一个 GL 类型中做所有事情,因为仍然会有两个 forloop 供 openGL 绘制。 嗯,同样的问题。有解决办法吗? 【参考方案1】:

根据您所说的“星形”,请记住GL_POLYGON 只能正确渲染凸多边形:

GL_POLYGON:

绘制单个凸多边形。 顶点 1 到 N 定义了这个 多边形。

【讨论】:

我对轮廓和填充使用相同的显示列表,为什么一个看起来不错而另一个不好看? 轮廓只是按顺序绘制线段,所以它不关心多边形的“内部”或“外部”是什么。填充算法确实需要知道,如果多边形是凸多边形,则确定要容易得多,因此大多数填充算法都需要它。如果需要,您可以随时将凹多边形分解为多个凸多边形。 我明白了。所以我需要用一个形状绘制填充轮廓,然后用另一组填充?这样只会勾勒出星星的外部(而不是所有内部三角形),对吗?

以上是关于OpenGL填充多边形颜色“出血”的主要内容,如果未能解决你的问题,请参考以下文章

qt creator 怎么画圆环,还要填充颜色

OpenGL研究3.0 多边形区域填充

计算机图形学输出图元_10_多边形填充区_7_OpenGL多边形填充区函数(上)

OpenGL + GLUT没有填充最左边的多边形?

在 OpenGL 3+ 中有效地绘制多边形(每个多边形一种颜色)

OpenGL 填充非凸多边形