2011-04-13 157 views
2

我想绘制一个5指向明星形状在openGL(Java)中,这是充满和概述。我使用的代码绘制它OpenGL填充多边形颜色“流血”

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(); 

当我这样做,明星的轮廓绘制完美,但填充颜色会在轮廓边缘外出血(如果我在没有轮廓的情况下绘制它,那么多边形的外观也不会很明显)。任何想法为什么?

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

enter image description here

感谢这个问题, 杰夫

+1

出血?截图? – genpfault 2011-04-13 20:49:25

+1

添加屏幕截图。 – 2011-04-13 21:25:08

+0

您是否尝试过使用简单的'GL_TRIANGLE_FAN'? – Marnix 2011-04-13 21:30:24

回答

7

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

GL_POLYGON

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

+0

我为大纲和填充使用了相同的显示列表,所以为什么一个看起来不错,但另一个不是? – 2011-04-13 21:26:20

+3

轮廓只是按顺序绘制线段,所以它不关心多边形的“内部”或“外部”。填充算法确实需要知道,如果多边形是凸的,那么确定要容易得多,所以大多数填充算法都需要它。如果需要,可以将凹多边形总是分成多个凸多边形。 – dfan 2011-04-13 21:29:27

+0

我明白了。所以我需要用一个形状绘制填充轮廓,并填充另一个形状?通过这种方式,只有星的外部会被勾画出来(而不是所有的内部三角形),是正确的吗? – 2011-04-13 21:33:06