2011-04-13 246 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