OpenGL中的亚像素绘制

3

我在白屏幕上画了很多小黑矩形,当它们移动和缩放时,它们看起来不太优美。

我该如何绘制它们,使得如果边缘处于像素之间,则像素将是灰色而不是黑色?


你是如何画矩形的? - genpfault
3个回答

3
子像素渲染比普通的抗锯齿更复杂。如果您使用的显示器以RGB格式显示像素,则灰色形状在半个像素处结束时可能会呈现为黄色或青色,这取决于形状位于像素的哪一侧。当结果图像未以本机分辨率绘制或在与预期不同的布局的显示器上绘制时,这看起来可能很奇怪,但否则看起来可能非常好。

Subpixel rendering applied to text

这是应用于文本的子像素渲染示例;左侧面板是颜色,中心面板是显示版本的颜色,右侧面板是感知亮度。请注意,色相的准确性与亮度的准确性交换。
一种方法是分别渲染每个通道,每个通道在渲染空间中稍微偏移适当量,以使组合图像呈现完整的颜色。每个通道必须与结果图像具有相同的分辨率;每个通道都使用反走样方式进行渲染,就像原始图像一样,只是其他颜色被忽略了。创建通道后,它们可以通过简单的加法组合。我不知道是否存在像glEnable/glHint版本那样的“纯”解决方案,但它可能存在或将来存在。

0
你实际上在询问的是“抗锯齿”,而有许多方法可以实现它。其中一种方法总结在这个游戏开发主题中:http://www.gamedev.net/topic/107637-glenablegl_polygon_smooth/
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

glHint(GL_POINT_SMOOTH, GL_NICEST);
glHint(GL_LINE_SMOOTH, GL_NICEST);
glHint(GL_POLYGON_SMOOTH, GL_NICEST);

glEnable(GL_POINT_SMOOTH);
glEnable(GL_LINE_SMOOTH);
glEnable(GL_POLYGON_SMOOTH);

我尝试过了,但方块仍然每次只移动一个像素。我尝试将其分成两个三角形,但情况仍然没有改变。 - user181351

0

glEnable(GL_SMOOTH);应该可以实现。


1
光滑多边形并非所有实现都可用。而且它们使用起来很繁琐。相反,我建议使用多重采样技术。 - datenwolf
@datenwolf:但是我们不是在谈论任意多边形。我希望矩形得到支持(如果必要,可以始终将其绘制为一对三角形)。 - Ben Voigt
用“填充图元”替换“多边形”。OpenGL将其称为多边形平滑,但也适用于三角形和四边形。无论如何,平滑模式使用起来很繁琐。 - datenwolf
@datenwolf:哪种实现不支持三角形平滑呢?据我所知,这个功能已经存在了很长时间,并且在3+版本中也没有被弃用,因此几乎应该是普遍可用的。 - Ben Voigt
1
一些(较旧的)实现根本不会这样做(边缘仍然粗糙),有些是通过在边缘上绘制具有抖动端点的线来实现它。总的来说,POLYGON_SMOOTH 是有问题的。多重采样提供了更好的质量,并且更容易使用。 - datenwolf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接