如何在OpenGL中绘制空心矩形?现有代码生成填充矩形需解决
解决OpenGL中绘制空心矩形的问题
你遇到的核心问题是选对了图元类型——GL_POLYGON的设计目标就是填充顶点围成的多边形区域,所以不管你添加多少顶点,它都会把所有顶点构成的闭合区域填满,这就是为什么你得到的是填充矩形而非空心效果。
下面给你两种正确的实现思路,对应你想要的不同空心效果:
1. 绘制单层空心矩形(最常用)
直接使用GL_LINE_LOOP图元,它会自动将顶点依次连接成闭合的线段,不会填充内部区域。只需要提供矩形的四个顶点即可(自动闭合,不需要重复第一个顶点):
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); // 设置线宽(可选,让边框更明显) glLineWidth(1.5); glBegin(GL_LINE_LOOP); glVertex3f(-0.8, -0.86, 0); // 左上角 glVertex3f(-0.7, -0.86, 0); // 右上角 glVertex3f(-0.7, -0.96, 0); // 右下角 glVertex3f(-0.8, -0.96, 0); // 左下角 glEnd(); }
2. 绘制双层空心矩形(对应你代码里的双层结构)
如果你是想实现类似内外边框的双层空心效果,不要把所有顶点放在同一个GL_POLYGON里,而是分别用两次GL_LINE_LOOP绘制外层和内层的矩形:
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); glLineWidth(1.0); // 绘制外层空心矩形 glBegin(GL_LINE_LOOP); glVertex3f(-0.8, -0.86, 0); glVertex3f(-0.7, -0.86, 0); glVertex3f(-0.7, -0.96, 0); glVertex3f(-0.8, -0.96, 0); glEnd(); // 绘制内层空心矩形 glBegin(GL_LINE_LOOP); glVertex3f(-0.79, -0.87, 0); glVertex3f(-0.71, -0.87, 0); glVertex3f(-0.71, -0.95, 0); glVertex3f(-0.79, -0.95, 0); glEnd(); }
额外说明
- 如果你不想用
GL_LINE_LOOP,也可以用GL_LINES,但需要手动提供每一条边的两个顶点(比如左上角→右上角,右上角→右下角,以此类推,共8个顶点),不过GL_LINE_LOOP更简洁。 - 记得在绘制线框前,确保没有开启填充模式(默认是填充,但如果你之前修改过,可以用
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)强制切换为线框模式,不过用GL_LINE_LOOP更直接)。
内容的提问来源于stack exchange,提问作者e-info128
相关产品推荐
相关产品推荐

