需要在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();
}
但结果是一个填充的矩形:(
答案 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_LINES
,GL_LINE_STRIP
,GL_LINE_LOOP
包含邻接信息的行原语:GL_LINES_ADJACENCY
,GL_LINE_STRIP_ADJACENCY
邻接不会创建更多几何图形,但提供可在几何着色器阶段使用的信息。
三角形基元:GL_TRIANGLES
,GL_TRIANGLE_STRIP
,GL_TRIANGLE_FAN
具有邻接信息的三角形基元:GL_TRIANGLES_ADJACENCY
,GL_TRIANGLE_STRIP_ADJACENCY
邻接不会创建更多几何图形,但提供可在几何着色器阶段使用的信息。
对于完整性的疾病,有已弃用的基元类型列表:GL_QUADS
,GL_QUAD_STRIP
和GL_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();