getContext('webgl') 与 getContext('3d') 有啥区别?

Posted

技术标签:

【中文标题】getContext(\'webgl\') 与 getContext(\'3d\') 有啥区别?【英文标题】:What is the difference between getContext('webgl') vs getContext('3d')?getContext('webgl') 与 getContext('3d') 有什么区别? 【发布时间】:2014-05-10 04:28:24 【问题描述】:

我开始学习WebGL,因为找了一些老教程,不知道2014年的正确方法是什么?

我启动了<canvas>(基本),在教程中他们说:

使用getContext('2d'),如果您想使用WebGL,则使用3d 而不是2d

但现在我正在学习,我发现教程谈论的是getContext('webgl') 而不是getContext('3d')

语法改变了吗?

还有this的文章说没有真正的3D,但他们只使用Ray Casting?!

【问题讨论】:

MDN's reference 列出了 一些 浏览器支持的 webglexperimental-webgl 所以3d这个词已经被弃用了? 我不知道完整的故事,这就是为什么我只添加了一条评论,但该页面没有提到曾经存在过的 '3d' 上下文。你有推荐'3d' 的例子吗?也许作者只是猜测,因为 '2d' 最初是唯一可用的选项。 webgl 这个词是有意义的,因为 webgl 不仅仅是 3d 【参考方案1】:

Mozilla Developer Netowrk (MDN) 文档这样说:

getContext(in DOMString contextId) RenderingContext 返回画布上的绘图上下文,如果不支持上下文 ID,则返回 null。绘图上下文可让您在画布上绘图。使用“2d”调用 getContext 会返回一个 CanvasRenderingContext2D 对象,而使用“experimental-webgl”(或“webgl”)调用它strong>") 返回一个 WebGLRenderingContext 对象。此上下文仅在实现 WebGL 的浏览器上可用。

结果: | Context | Chrome (webkit) | Firefox (gekko) | | ------------------ | ------------------------ | ------------------------ | | 2d | CanvasRenderingContext2D | CanvasRenderingContext2D | | 3d | null | null | | webgl | WebGLRenderingContext | WebGLRenderingContext | | experimental-webgl | WebGLRenderingContext | null |

我建议阅读webgl wiki:http://www.khronos.org/webgl/wiki/FAQ

这是完整的What is the recommended way to initialize WebGL? 部分: (虽然我建议你直接从wiki 阅读它,以防它发生变化!)


推荐的初始化 WebGL 的方法是什么?

建议您检查初始化成功或失败。如果 WebGL 初始化失败,建议您区分失败是因为浏览器不支持 WebGL,还是因为其他原因失败。如果浏览器不支持 WebGL,则向用户显示指向“http://get.webgl.org”的链接。如果 WebGL 因其他原因失败,则向用户提供指向“http://get.webgl.org/troubleshooting/”的链接

您可以通过检查 WebGLRenderingContext 的存在来确定浏览器是否支持 WebGL。

if (window.WebGLRenderingContext) 
  // browser supports WebGL

如果浏览器支持 WebGL 并且 canvas.getContext("webgl") 返回 null 则 WebGL 由于用户浏览器以外的其他原因(没有 GPU、内存不足等)而失败

  if (!window.WebGLRenderingContext) 
    // the browser doesn't even know what WebGL is
    window.location = "http://get.webgl.org";
   else 
    var canvas = document.getElementById("myCanvas");
    var ctx = canvas.getContext("webgl");
    if (!ctx) 
      // browser supports WebGL but initialization failed.
      window.location = "http://get.webgl.org/troubleshooting";
    
  

注意:您必须检查浏览器是否支持 WebGL,才能知道从 canvas.getContext() 获取 null 意味着 There is a wrapper that will do all of this for you here.

使用包装器的示例

<html>
<body>
<script type="text/javascript" src="localpath/webgl-utils.js"></script>
<script>
  function init() 
    canvas = document.getElementById("c");
    gl = WebGLUtils.setupWebGL(canvas);
    if (!gl) 
      return;
    
    ...
  

  window.onload = init;
</script>
<canvas id="c"></canvas>
</body>
</html>

【讨论】:

啊!谢谢!所以肯定没有3d,那篇文章说canvas伪造3d只使用2d,还是因为它是一篇旧文章? @Abdelouahab,说 3d API 实际上是 2d API 是很老的问题:***.com/questions/13135210/… 这只是一种思维方式,真的。如果有人问你,canvas 使用的是真正的 3d,它不是在伪造任何东西。 @AbstractAlgorithm 啊谢谢!现在我更新我的信息!网上有很多旧教程,也有过时的,需要修复!再次感谢您^_^

以上是关于getContext('webgl') 与 getContext('3d') 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

webgl 三角形绘制

在测试WebGL上下文后删除WebGL上下文

使用canvas 和 webgl2制作界面系统

在 Three.js 着色器上启用扩展

Map request=(Map)ActionContext.getContext().get("request");

iOS 8 Safari webgl 没有抗锯齿