用opengl绘制子像素

时间:2011-04-11 20:35:00

标签: c++ opengl

我在白色屏幕上绘制了许多小的黑色矩形,当它们四处移动并且放大时看起来不是很优雅。

如何绘制它们,如果边缘位于像素之间,像素将是灰色而不是黑色?

3 个答案:

答案 0 :(得分:1)

您实际要求的是anti-aliasing,并且有很多方法可以做到这一点。在这个gamedev主题中总结了一种方法: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);

答案 1 :(得分:1)

子像素渲染实际上比常规抗锯齿更复杂。如果您使用的是RGB格式像素的显示器,则在像素中间结束的灰色形状可能会呈现为黄色或青色,具体取决于形状所在像素的哪一侧。如果生成的图像不是以原始分辨率绘制的,或者是在布局不同于预期的显示器上,这看起来很奇怪,但是看起来很不错。

Subpixel rendering applied to text

以下是应用于文本的子像素渲染示例;左侧面板是彩色,中间面板是颜色的显示版本,右侧面板是感知亮度。请注意,色调的准确性与亮度的准确性相互交换。

一种方法可能是分别渲染每个通道,每个通道在渲染空间中稍微偏移适当的量,以使组合图像为全色。每个通道必须与生成的图像具有相同的分辨率;除了忽略其他颜色外,每个通道都使用与原始通道相同的方式渲染抗锯齿。创建通道后,可以将它们与简单添加相结合。我不知道像普通抗锯齿这样的glEnable / glHint版本的“纯”解决方案,但它可能存在或将来可能存在。

答案 2 :(得分:0)

glEnable(GL_SMOOTH);应该这样做。