2016-01-09 3 views
0

Интересно, как я могу получить любой экземпляр программы WebGL (WebGLProgram) из любого желаемого контекста WebGL?Как получить объект WebGLProrgram из уже созданного контекста WebGL?

Чтобы получить контекст WebGL, НЕ является проблемой. Вы ищете в DOM текущей страницы для графического элемента с помощью document.getElementsByTagName() или document.getElementById(), если вы знаете точный холст ID:

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

Здесь мы извлекаем текущий контекст, как я полагаю, но если я хочу, чтобы получить некоторые параметры шейдера или получить определенное значение из уже запущенного вершинного/фрагментарного шейдера - мне нужно иметь программу WebGL, связанную с текущим контекстом рендеринга WebGL.

Но я не могу найти какой-либо метод в API WebGL, например context.getAttachedProgram() или context.getActiveProgram().

Так как же получить активную программу WebGL, которая используется для процесса рендеринга? Может быть, есть какой-то специальный параметр WebGL?

ответ

3

Невозможно получить все программы или любые другие ресурсы из контекста 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 Shader Editor Extension.

Если вы хотите обернуть все контексты, вы можете использовать аналогичную технику для обертывания 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)); 
+0

мужчина, это здорово! замечательный ответ! 5 звезд! Спасибо за помощь. Моя цель - обеспечить возможность отладки любой программы WebGL (из трех. Js, babylon.js или другой структуры). Также, кстати, вы рассказали об инспекторе WebGL. Этот плагин (не знаю почему) не может распечатать информацию об отладке моего контекста, не знаю даже почему. –

Смежные вопросы