iOS 8 Safari webgl 没有抗锯齿

Posted

技术标签:

【中文标题】iOS 8 Safari webgl 没有抗锯齿【英文标题】:No antialiasing for iOS 8 safari webgl 【发布时间】:2014-08-19 15:58:35 【问题描述】:

支持 webgl 的 ios 8 上的 Safari 肯定是一个好消息,但在我运行我的演示后,我发现没有抗锯齿。有什么解决办法吗?

【问题讨论】:

【参考方案1】:

你拥有的角色?抗锯齿有很多方法。这是一个。首先检查您是否还没有抗锯齿

var gl = someCanvas.getContext("webgl");
var contextAttribs = gl.getContextAttributes();
if (!contextAttribs.antialias) 
  // do your own anti-aliasing

最简单的方法是让画布的后备存储空间大于其显示的大小。假设您有一个想要以特定尺寸显示的画布

canvas.width = desiredWidth * 2;
canvas.height = desiredHeight * 2;
canvas.style.width = desiredWidth + "px";
canvas.style.height = desiredHeight + "px";

现在您的画布在绘制时很可能会进行双线性过滤。在 iOS 的情况下,因为它们都是 HD-DPI,你可能需要做 4x

canvas.width  = desiredWidth  * 4;
canvas.height = desiredHeight * 4;
canvas.style.width  = desiredWidth  + "px";
canvas.style.height = desiredHeight + "px";

您可以通过查看window.devicePixelRatio 找到答案。事实上,如果你想要 1x1 像素,你会这样做

var devicePixelRatio = window.devicePixelRatio || 1;
var overdraw = 1; // or 2
var scale = devicePixelRatio * overdraw;
canvas.width  = desiredWidth  * scale;
canvas.height = desiredHeight * scale;
canvas.style.width  = desiredWidth  + "px";
canvas.style.height = desiredHeight + "px";

否则,另一种方法是渲染到附加到帧缓冲区的纹理,然后将纹理渲染到画布using a shader that does antialiasing。

【讨论】:

非常感谢。我稍后会尝试。 通过扩大画布解决问题。再次感谢! 嗨,gman。我知道您是 WebGL 方面的专家。我又遇到了一个问题:***.com/questions/26530799/…我在等你的回答。

以上是关于iOS 8 Safari webgl 没有抗锯齿的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 Emscripten 激活抗锯齿

在 iOS 中,如何在没有抗锯齿/插值的情况下绘制位图?

Unity QualitySettings.antiAliasing 抗锯齿

Firefox中带有边框图像的旋转div上的抗锯齿

C#制作不规则窗体,如何使边缘平滑(抗锯齿)?

如何在没有抗锯齿的情况下在画布上绘制像素字体