Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用opengl绘制亚像素图形_C++_Opengl - Fatal编程技术网

C++ 用opengl绘制亚像素图形

C++ 用opengl绘制亚像素图形,c++,opengl,C++,Opengl,我在白色屏幕上画了很多黑色的小矩形,当它们移动和缩放时,看起来不太优雅 如果边缘位于像素之间,如何绘制它们,使像素为灰色而不是黑色?glEnable(GL_平滑)应该这样做。你实际上要求的是抗锯齿,有很多方法可以做到这一点。游戏开发主题中总结了一种方法: 亚像素渲染实际上比常规抗锯齿更复杂。如果使用RGB格式的像素显示,则在像素中间结束的灰色形状可能渲染为黄色或青色,具体取决于该形状位于像素的哪一侧。如果生成的图像不是以本机分辨率绘制的,或者不是在具有不同于预期布局的显示器上绘制的,则这可能看起

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


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

glEnable(GL_平滑)
应该这样做。

你实际上要求的是
抗锯齿,有很多方法可以做到这一点。游戏开发主题中总结了一种方法:


亚像素渲染实际上比常规抗锯齿更复杂。如果使用RGB格式的像素显示,则在像素中间结束的灰色形状可能渲染为黄色或青色,具体取决于该形状位于像素的哪一侧。如果生成的图像不是以本机分辨率绘制的,或者不是在具有不同于预期布局的显示器上绘制的,则这可能看起来很奇怪,但在其他情况下,它可能看起来非常漂亮

下面是一个应用于文本的亚像素渲染示例;左侧面板是颜色,中间面板是颜色的显示版本,右侧面板是可感知的亮度。请注意,色调的准确度与亮度的准确度进行了交换


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

如何绘制矩形?并非所有实现都提供平滑多边形。而且它们使用起来很乏味。相反,我建议进行多重采样。@datenwolf:但我们不是在讨论任意多边形。我希望矩形能得到支持(如果有必要,可以一直画成一对三角形)。OpenGL称之为多边形平滑,但它也适用于三角形和四边形。不管怎样,平滑模式使用起来很乏味。@DatenWalf:什么实现不支持三角形平滑?AFAICT此功能已经存在很长时间了,在3+中没有被弃用,因此它应该几乎是普遍可用的。一些(较旧的)实现根本不支持它(边缘仍然参差不齐),一些实现是通过沿边缘绘制线和抖动的端点来实现的。总而言之,你的光滑是邪恶的。多采样提供了更好的质量和更易于使用。我尝试了这一点,但块仍在一次移动一个像素。我试着分成两个三角形,但它仍然在发生
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);