You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:44:58