【问题标题】:2D openGL drawing lines that don't exactly fit pixel raster不完全适合像素栅格的 2D openGL 绘图线
【发布时间】:2010-12-14 02:48:11
【问题描述】:

我在 OpenGL 中绘制类似于 LED VU 表的东西。结果应该是这样的:

不幸的是,我的绘图空间受到限制,我必须在其上恰好放置 18 条。这会产生 3.6 像素的条之间的间距。

绘制时,这会导致线条之间的间隙出现明显差异,因为间隙为 2 或 1 像素宽。我正在寻找一种使用亚像素渲染的解决方案,而不是通过某种抗锯齿来“伪造”线条,以便所有间隙都显示为相同的宽度。

这是我目前的代码

glEnable(GL_LINE_SMOOTH);
glHint(GL_LINE_SMOOTH, GL_NICEST);
for (int i = 0; i < 18; ++i) {
            float bBottom = barBottom + i*3.6f;
            glBegin(GL_LINES);
            glLineWidth(2);
            glVertex2f(bRight,bBottom);
            glVertex2f(bLeft,bBottom);
            glEnd();
}
glDisable(GL_LINE_SMOOTH);

很遗憾,开启线条平滑没有明显效果。有什么建议吗?

【问题讨论】:

  • 将像素值四舍五入为整数。
  • GL_LINE_SMOOTH 并非所有实现都支持。我同意@Matt Ball 的观点,你应该将线条四舍五入到整数像素,并画一条边界线,或者只是在顶部留下一个间隙(在这种情况下约为 10 像素)。

标签: c opengl rendering 2d antialiasing


【解决方案1】:

两个想法:

  1. 将所有条形图绘制到一个大的屏幕外纹理,使间隙和宽度都相等,然后使用双线性过滤将结果blit 到所需的屏幕位置和大小。

  2. 让美工绘制所有完全亮起的条以使其看起来不错,然后从每个条的顶部向下绘制带有 Alpha 通道的黑色矩形,以使图像的所需部分变暗。

【讨论】:

    【解决方案2】:

    使用多重采样 (Multisampling specs)。

    此外,我会使用四边形(而不是线条)来渲染这些块。

    【讨论】:

      【解决方案3】:

      如果您无法为您的 OpenGL 上下文启用抗锯齿,您可以模拟它 - 使用如此简单的图形很容易。当您需要绘制 10.6 像素高的矩形时,用它的颜色绘制 10 像素,然后绘制中间颜色的单像素线(矩形颜色的 0.6 和背景颜色的 0.4)。

      【讨论】:

      • 根据显示器的亚像素对齐方式,这只适用于一个方向,最有可能是垂直方向。 OpenGL 对这类事情并不是很有用,即高质量矢量图形。将 3D 镶嵌对象的三角形推到屏幕上是首要考虑。
      • 从未听说过“显示器的亚像素对齐”,它是什么?
      • LCD 上单个红/绿/蓝点的布局 - 它们不在同一个位置。它主要用于高质量字体抗锯齿(ClearType 等)。
      • 这就是亚像素对齐很重要的原因:antigrain.com/research/font_rasterization/… 您也可以从其 EDID 检索显示器亚像素对齐
      • @alxx 不要那么狭隘。这不仅仅是关于文本。这是关于将几何图形放置在分数像素位置上。它适用于所有形式的几何体。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-26
      • 1970-01-01
      • 2015-07-03
      • 2014-09-25
      • 2012-09-29
      相关资源
      最近更新 更多