2015-09-10 3 views
2

Я новичок в OpenTK, и я использую следующий код, чтобы привлечь большое количество полигонов с использованием OpenTKКак правильно нарисовать многоугольник с OpenTK

public static void DrawPolygon(Point[] points) 
{ 
    GL.Begin(BeginMode.Polygon); //IF I Change this to LineStrip every things will be OK 
    int numberOfPoints = points.Length; 
    for (int i = 0; i < numberOfPoints; i++) 
    { 
     GL.Vertex2(points[i].X, points[i].Y); 
    } 
    GL.End(); 
} 

И это конфигурационный код, который выполняется перед вызовом DrawPolygon

GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); 

GL.MatrixMode(MatrixMode.Projection); 
GL.LoadIdentity(); 
GL.Ortho(0, width, 0, height, -1, 1); // Bottom-left corner pixel has coordinate (0, 0) 
GL.Viewport(0, 0, (int)width, (int)height); 

GL.ClearColor(drawing.Color.Transparent); 

GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); 

GL.MatrixMode(MatrixMode.Modelview); 
GL.LoadIdentity(); 
GL.Color3(pen.Color); 
GL.PolygonMode(MaterialFace.FrontAndBack, PolygonMode.Line); 
GL.PointSize(5f); 
GL.LineWidth(2f); 

Используя этот код, когда я сохранить изображаемый образ на диск как PNG, результат будет как этот

enter image description here

результат для: GL.Begin(BeginMode.Polygon);

Однако если изменить первую строку DrawPolygon до GL.Begin(BeginMode.LineStrip); полигона будет вынесено, как ожидается, как это:

enter image description here

результат для: GL.Begin(BeginMode.LineStrip);

Кто-нибудь знает, почему эти две дополнительные строки появляются при использовании BeginMode.Polygon?

ответ

2

Я считаю, что это потому, что GL_POLYGON/BeginMode.Polygon оказывает только convex polygons. Я думаю, что если вы попытаетесь сделать вогнутый многоугольник, как вы это делаете, драйвер попытается разделить геометрию, которую вы даете ей, чтобы отобразить ее как выпуклые полигоны, а значит, и неожиданные строки в вашем примере.

Невозможно использовать режим рендеринга многоугольника в OpenGL. Оформление линейных полос и треугольников намного более оптимизировано и, следовательно, намного, намного быстрее. Я бы посоветовал остаться с линейными полосками.

+0

Можно ли нарисовать многоугольник с режимом «Треугольник»? Что делать, если я хочу нарисовать заполненные полигоны? В этом случае я не могу использовать режим LineStrip. –

+1

Чтобы нарисовать фигуру треугольниками, вам понадобится использовать метод [polygon triangulation] (https://en.wikipedia.org/wiki/Polygon_triangulation), чтобы разложить ваш многоугольник на список треугольников. –

+0

Если триангуляция выполняется быстрее, можете ли вы предоставить образец кода? –