如何在opengl中绘制一个空矩形?

时间:2018-01-20 14:13:48

标签: c++11 opengl

需要在opengl中绘制一个空心矩形,我尝试使用原始对象:

void Skin::draw()
{
    glColor4f(1.0, 1.0, 1.0, 1.0);
    glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);

    glBegin(GL_POLYGON);

    glVertex3f(-0.8, -0.86, 0); // XYZ left, top
    glVertex3f(-0.7, -0.86, 0); // XYZ right, top
    glVertex3f(-0.7, -0.96, 0); // XYZ right, bottom
    glVertex3f(-0.8, -0.96, 0); // XYZ left, bottom
    glVertex3f(-0.8,  -0.86, 0); // XYZ left, top (close)

    glVertex3f(-0.79, -0.87, 0); // XYZ left, top (diagonal down-right)
    glVertex3f(-0.79, -0.95, 0); // XYZ left, bottom
    glVertex3f(-0.71, -0.95, 0); // XYZ right, bottom
    glVertex3f(-0.71, -0.87, 0); // XYZ right, top
    glVertex3f(-0.79, -0.87, 0); // XYZ left, top (close)

    glVertex3f(-0.8, -0.86, 0); // XYZ left, top (close diagonal top-left)

    glEnd();
}

但结果是一个填充的矩形:(

1 个答案:

答案 0 :(得分:1)

如果要使用已弃用的OpenGL固定功能管道绘制矩形,则可以使用glRect。但是你必须先改变多边形模式。见glPolygonMode。多边形模式定义顶点坐标(GL_POINT)上是否有绘制点,顶点坐标(GL_LINE)之间的线条或基元包围的区域是否填充(GL_FILL) :

glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glRectf( -0.8, -0.96, -0.7, -0.86 );
glRectf( -0.79, -0.95, -0.71, -0.87 );

一般来说,OGL中有不同类型的Primitives

  • 点基元:GL_POINTS

  • 行原语:GL_LINESGL_LINE_STRIPGL_LINE_LOOP

  • 包含邻接信息的行原语:GL_LINES_ADJACENCYGL_LINE_STRIP_ADJACENCY
    邻接不会创建更多几何图形,但提供可在几何着色器阶段使用的信息。

  • 三角形基元:GL_TRIANGLESGL_TRIANGLE_STRIPGL_TRIANGLE_FAN

  • 具有邻接信息的三角形基元:GL_TRIANGLES_ADJACENCYGL_TRIANGLE_STRIP_ADJACENCY
    邻接不会创建更多几何图形,但提供可在几何着色器阶段使用的信息。

对于完整性的疾病,有已弃用的基元类型列表:GL_QUADSGL_QUAD_STRIPGL_POLYGON

进一步查看Line primitives

  

根据顶点流的不同解释,有3种线基元。

     
      
  • GL_LINES:顶点0和1被视为一条线。顶点2和3被认为是一条线。等等。如果用户指定非偶数顶点,则忽略额外顶点。

  •   
  • GL_LINE_STRIP:相邻的顶点被视为线条。因此,如果你传递n个顶点,你将获得n-1行。如果用户仅指定1个顶点,则忽略绘图命令。

  •   
  • GL_LINE_LOOP:作为线条,但第一个和最后一个顶点也用作一条线。因此,n个输入顶点得到n行。如果用户仅指定1个顶点,则忽略绘图命令。第一个和最后一个顶点之间的线发生在序列中的所有前一行之后。

  •   


这意味着,一个矩形可以由GL_LINE_LOOP绘制,有4个顶点:

glBegin(GL_LINE_LOOP);
glVertex3f(-0.8, -0.86, 0); // XYZ left, top
glVertex3f(-0.7, -0.86, 0); // XYZ right, top
glVertex3f(-0.7, -0.96, 0); // XYZ right, bottom
glVertex3f(-0.8, -0.96, 0); // XYZ left, bottom
glEnd();

glBegin(GL_LINE_LOOP);
glVertex3f(-0.79, -0.87, 0); // XYZ left, top
glVertex3f(-0.79, -0.95, 0); // XYZ left, bottom
glVertex3f(-0.71, -0.95, 0); // XYZ right, bottom
glVertex3f(-0.71, -0.87, 0); // XYZ right, top
glEnd();