如何通过 Emscripten 激活抗锯齿

Posted

技术标签:

【中文标题】如何通过 Emscripten 激活抗锯齿【英文标题】:How to activate anti-aliasing via Emscripten 【发布时间】:2014-04-03 19:40:48 【问题描述】:

在 webGL 中,可以像

一样在画布上下文初始化上激活抗锯齿功能
gl = canvas.getContext("experimental-webgl",  antialias: true );

我的简单问题是:如何通过 Emscripten C++ 将这个选项设置为 asm.js 编译器?我不询问通过自定义着色器代码实现我自己的抗锯齿。

【问题讨论】:

我在输出的 .js 文件中找到了以下代码,这暗示了在不编辑用于生成的 html/js“shell 文件”的情况下可能会以某种方式设置变量:createContext:function (canvas, useWebGL, setInModule, webGLContextAttributes) return ctx = canvas.getContext(webglId, contextAttributes); 【参考方案1】:

在 SDL 中,您可以通过 SDL_GL_MULTISAMPLEBUFFERS 设置启用抗锯齿。像这样:

SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1); // enable MULTISAMPLE
SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 2); // can be 2, 4, 8 or 16
SDL_SetVideoMode(...)

本机代码将为 gl 上下文启用抗锯齿。看看 library_sdl.js:

// in makeSurface function
var webGLContextAttributes = 
    antialias: ((SDL.glAttributes[13 /*SDL_GL_MULTISAMPLEBUFFERS*/] != 0) && (SDL.glAttributes[14 /*SDL_GL_MULTISAMPLESAMPLES*/] > 1)),
    depth: (SDL.glAttributes[6 /*SDL_GL_DEPTH_SIZE*/] > 0),
    stencil: (SDL.glAttributes[7 /*SDL_GL_STENCIL_SIZE*/] > 0)
;

【讨论】:

【参考方案2】:

如果使用 SDL,如另一个答案中所述,您可以简单地调用以下代码:

SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 0 or 1);

如果使用 GLUT,则必须简单地调用 glutInitDisplayMode() 带/不带 GLUT_MULTISAMPLE

如果使用 EGL,唯一的选择是强制将构建的 javascript 代码从 _glutInitDisplayMode(146); 更改为 _glutInitDisplayMode(18);,因为 eglCreateContext() 只是在内部使用 GLUT 命令。

【讨论】:

以上是关于如何通过 Emscripten 激活抗锯齿的主要内容,如果未能解决你的问题,请参考以下文章

求教各位QT高手,如何实现抗锯齿的圆形头像

JAVA 用drawLine画斜线出现锯齿,如何抗锯齿

如何在 Windows 中启用字体抗锯齿 [关闭]

OpenGL 抗锯齿不起作用

Windows Server 2012 通过 RDP 强制字体平滑(抗锯齿)

如何在 MATLAB 的 imresize 中实现抗锯齿?