在 OpenGL 中绘制 2D 形状的轮廓,同时更改线条粗细

Posted

技术标签:

【中文标题】在 OpenGL 中绘制 2D 形状的轮廓,同时更改线条粗细【英文标题】:Drawing outline of 2D shapes in OpenGL while changing the line thickness 【发布时间】:2013-05-10 03:15:49 【问题描述】:

所以我正在尝试(我认为很简单)使用 OpenGL 绘制多个 2D 形状的轮廓。在我尝试使用glLineWidth(w); 更改轮廓的线条粗细之前,这一切似乎都有效。我的第一个问题是 w = 10 或 w = 3000(或任何更大的数字)显示相同的线条粗细,但像 w= 这样更小的东西3 产生更细的线条。

我认为这与它有关。我的 Max 似乎是 7,我可以增加它吗?我只想画一条粗线!!

float lineWidth[2];
glGetFloatv(GL_LINE_WIDTH_RANGE, lineWidth);
std::cout<<"min: "<< lineWidth[0]<<" max: "<<lineWidth[1]<<"------\n";

我的第二个问题是我的线条相交的点似乎没有对齐或其他东西,这使得我的所有形状(矩形、圆形、三角形)看起来都缺少一点点。这是Draw percentage of circle outline 此处提到的行为,但我似乎无法从帖子所说的内容中解决它。

这是我用来绘制矩形的代码:

glLineWidth(20);
glBegin(GL_LINE_LOOP);
glVertex2f(x1, y1);//1
glVertex2f(a1, a2);//2
glVertex2f(x2, y2);//3
glVertex2f(b1, b2);//4
glEnd();

从上面提到的帖子中,这是我用于圆圈的代码:

glEnable(GL_LINE_SMOOTH);
glLineWidth(10); 
glBegin(GL_LINE_STRIP); 
for (int i=0; i < (360/10*100/10); i++)  
     float degInRad = i*DEG2RAD; 
     glVertex2f(x1+cos(degInRad)*r,y1+sin(degInRad)*r);  
glEnd();

“缺位”看起来像这样:

我也看过这篇帖子 How to render perfect wireframed rectangle in 2D mode with OpenGL?,但从那里跟踪线索并没有真正帮助。

【问题讨论】:

【参考方案1】:

我的第一个问题是 w = 10 或 w = 3000(或任何更大的数字)显示相同的线条粗细,但像 w=3 这样更小的值会产生更细的线条。

通过glGet()GL_LINE_WIDTH_RANGE 检查您的OpenGL 实现实际支持什么。如果它在10.0 达到顶峰,我不会感到惊讶。

我只想画个思路!!

对于大线宽,您必须使用三角形/四边形 do that yourself。

“缺位”看起来像这样:

OpenGL 没有指定宽度为&gt; 1.0GL_LINES 应该如何连接/封端。 It's up to the implementation.

【讨论】:

以上是关于在 OpenGL 中绘制 2D 形状的轮廓,同时更改线条粗细的主要内容,如果未能解决你的问题,请参考以下文章

旋转使用 OpenGL 绘制的 2D 对象

无法在opengl中绘制多个对象

2D OpenGL 场景因大量重叠形状而变慢

OpenGL填充多边形颜色“出血”

在 OpenGL 4 中创建第二个 VAO 并绘制两个形状

如何识别形状轮廓中的关节?