当前位置:  开发笔记 > 编程语言 > 正文

如何从已创建的WebGL上下文中获取WebGLProrgram对象?

如何解决《如何从已创建的WebGL上下文中获取WebGLProrgram对象?》经验,为你挑选了1个好方法。

我想知道,如何WebGLProgram从任何所需的WebGL上下文中获取任何WebGL程序实例()?

获取WebGL上下文不是问题.您正在使用document.getElementsByTagName()或搜索canvas元素的当前页面的DOM document.getElementById(),如果您知道确切的画布ID:

let canvas = document.getElementById( "canvasId" );
let context = canvas.getContext( "webgl" );

在这里我们按照我的想法获取当前上下文,但是如果我想获取一些着色器参数或从已经运行的顶点/片段着色器获得某些值 - 我需要一个WebGL程序,它与当前的WebGL渲染上下文相关联.

但我无法在WebGL API中找到任何方法,如context.getAttachedProgram()context.getActiveProgram().

那么获取用于渲染过程的活动WebGL程序的方式是什么?也许,有一些特殊的WebGL参数?



1> gman..:

无法从WebGL上下文获取所有程序或任何其他资源.如果上下文已经存在,那么您可以做的最好的事情是查看当前资源gl.getParameter(gl.CURRENT_PROGRAM)等等.

你可以做的是包装WebGL上下文

var allPrograms = [];

someContext.createProgram = (function(oldFunc) {
   return function() {
     // call the real createProgram
     var prg = oldFunc.apply(this, arguments);

     // if a program was created save it
     if (prg) {
       allPrograms.push(prg);
     }

     return prg;
   };
}(someContext.createProgram));

当然,您还需要包装gl.deleteProgram以从所有程序的数组中删除内容.

someContext.deleteProgram = (function(oldFunc) {
   return function(prg) {
     // call the real deleteProgram
     oldFunc.apply(this, arguments);

     // remove the program from allPrograms
     var ndx = allPrograms.indexOf(prg);
     if (ndx >= 0) {
        allPrograms.splice(ndx, 1);
     }
   };
}(someContext.deleteProgram));

这些是WebGL Inspector和WebGL着色器编辑器扩展等使用的技术.

如果要包装所有上下文,可以使用类似的技术进行换行getContext.

HTMLCanvasElement.prototype.getContext = (function(oldFunc) {
   return function(type) {
      var ctx = oldFunc.apply(this, arguments);
      if (ctx && (type === "webgl" || type === "experimental-webgl")) {
        ctx = wrapTheContext(ctx);
      }
      return ctx;
   };
}(HTMLCanvasElement.prototype.getContext));

推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有