0

我正在尝试使用 C 中的 OpenGL 绘制 L 形多边形。据我说,这段代码应该这样做,但它并没有给我预期的结果。我要绘制的形状类似于下面。发生错误的点是函数polygon1 中的点2。

我似乎在这里犯了一些错误,还是 OpenGL 中的错误。下图是红色错误输出,下面绘制的图表是代码的预期输出。

在此处输入图像描述

    ----
    |  |
    |  |
  ---  |
  |    |
  ------

void polygon1(float x,float y)
{
  glColor3f(0,1,0);
  glBegin(GL_POLYGON);
  glVertex2f(x,y);
  glVertex2f(x,y+25);
  glVertex2f(x+25,y+25);
  glVertex2f(x+25,y+75);
  glVertex2f(x+50,y+75);
  glVertex2f(x+50,y);
  glEnd();
  glFlush();
}

void mydisplay()
{
  polygon1(200.0,25.0);
}

void main(int argc,char **argv)
{
  glutInit(&argc,argv);
  glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);
  glutInitWindowSize(400,400);
  glutInitWindowPosition(540,320);
  glutCreateWindow("my first attempt");
  glClearColor(0.0f,0.0f,0.0,0.0f);
  glClear(GL_COLOR_BUFFER_BIT);   
  glutDisplayFunc(mydisplay);
  gluOrtho2D(0.0,400.0,0.0,400.0);
  glutMainLoop();
}
4

3 回答 3

2

OpenGL 只正确渲染凸多边形。您的“L”需要分成三角形条带。您可以手动或通过 GLU tesselators 执行此操作(我假设 GLU 是您的一个选项,因为无论如何您都在立即模式下渲染)。

于 2014-05-06T04:02:58.247 回答
1

正如 Drew Hall 在之前的回答中指出的那样,GL_POLYGON 无法绘制凹多边形。不过,您可以使用单个三角形风扇绘制此形状。尝试这个:

glBegin(GL_TRIANGLE_FAN);
glVertex2f(x+25,y+25);
glVertex2f(x,y+25);
glVertex2f(x,y);
glVertex2f(x+50,y);
glVertex2f(x+50,y+75);
glVertex2f(x+25,y+75);
glEnd();
于 2014-05-06T04:35:04.257 回答
0

正如已经提到的,OpenGL 不能自己做到这一点(除非你事先存储三角形)

OpenGL 不提供 tessellator,但 GLU 提供,如前所述。

如果 libGLU 不是一个选项,那么有一些曲面细分器 - libGDX 有一个非常简单的实现(在 Java 中 - 但易于移植)

Blender 有一个经过优化的代码的 C 端口(使用 2D kd-tree)

于 2014-08-21T11:25:52.760 回答