«кровотечение» цвета заполненного многоугольника OpenGL

#opengl

#opengl

Вопрос:

Я пытаюсь нарисовать форму пятиконечной звезды в OpenGL (Java), которая одновременно заполнена и очерчена. Код, который я использую для его рисования

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

Когда я делаю это, контур звезды прорисовывается идеально, но цвет заливки выходит за пределы контура (если я рисую его без контура, полигон также выглядит не очень четко). Есть идеи, почему?

РЕДАКТИРОВАТЬ: я добавил скриншот, показывающий проблему

введите описание изображения здесь

спасибо, Джефф

Комментарии:

1. Вы пробовали использовать простой GL_TRIANGLE_FAN ?

2. Смогу ли я также создать контур с треугольными вентиляторами? Я думаю, что если я сделаю это, то контур покажет все внутренние треугольники…

3. @Jeff: Нет, вы можете создать контур с помощью одной GL_LINE_STRIP и проигнорировать первую вершину для этого вызова. GL_TRIANGLE_FAN нуждается в дополнительной вершине для центра. Вам не обязательно делать все в одном и том же типе GL, потому что у OpenGL все равно будет два forloops для рисования.

4. Хм, здесь та же проблема. Есть ли решение для этого?

Ответ №1:

В зависимости от того, что вы подразумеваете под «формой звезды», помните, что GL_POLYGON можно корректно отображать только выпуклые многоугольники:

GL_POLYGON :

Рисует один выпуклый многоугольник. Вершины с 1 по N определяют этот полигон.

Комментарии:

1. Я использую один и тот же список отображения как для контура, так и для заливки, так почему один будет выглядеть хорошо, а другой нет?

2. Контур просто рисует сегменты линии по порядку, поэтому его не волнует, что находится «внутри» или «снаружи» многоугольника. Алгоритм заливки действительно должен знать, и это определение намного проще, если многоугольник выпуклый, поэтому большинство алгоритмов заливки требуют этого. Вы всегда можете разбить свой вогнутый многоугольник на несколько выпуклых многоугольников, если вам нужно.

3. Я вижу. Итак, мне нужно было бы нарисовать контур заливки одной фигурой и заполнить другим набором? Таким образом, будет очерчена только внешняя сторона звезды (а не все внутренние треугольники), правильно?