Обнаружение необходимых расширений WebGL
Я работаю над приложением WebGL (использующим ThreeJs), которое, очевидно, показывает 3D-модели, и мы используем некоторые эффекты (шейдеры), пытаясь сделать тест, чтобы узнать, может ли пользователь запустить приложение или нет, я нахожу способ получить список поддерживаемых плагинов в используемом браузере.
Вопрос:
проблема, с которой я сталкиваюсь, заключается в том, чтобы узнать, какие плагины требуются для моего приложения, есть ли способ их автоматического обнаружения?
Больше деталей:
для дальнейших деталей я бы указал пример того, что мне нужно:
- В моем MacBook Pro под Mac OSX Maverix приложение работает нормально
- Тестирование приложения на моем ноутбуке Lenovo, под Windows 7, затем Windows 8, приложение не работает, и проблема вызвана шейдером Bokeh2.
Изучая список поддерживаемых расширений WebGL, я обнаружил, что в Lenovo отсутствуют некоторые расширения по сравнению с Mac, поэтому как определить, какие именно расширения необходимы, если в случае их отсутствия приложение WebGL будет повреждено.
Это список расширений, которые у меня есть, как в Mac, так и в Lenovo.
В моем Mac:
ANGLE_instanced_arrays
WEBKIT_EXT_texture_filter_anisotropic
OES_element_index_uint
OES_standard_derivatives
OES_texture_float
OES_texture_float_linear
OES_texture_half_float
OES_texture_half_float_linear
OES_vertex_array_object
WEBKIT_WEBGL_compressed_texture_s3tc
WEBKIT_WEBGL_depth_texture
WEBGL_draw_buffers
WEBGL_lose_context
WEBGL_debug_renderer_info
В моем Lenovo:
ANGLE_instanced_arrays
WEBKIT_EXT_texture_filter_anisotropic
OES_element_index_uint
OES_standard_derivatives
OES_texture_float
OES_texture_half_float
OES_texture_half_float_linear
OES_vertex_array_object
WEBKIT_WEBGL_compressed_texture_s3tc
WEBGL_lose_context
WEBGL_debug_renderer_info
Недостающие в Lenovo:
OES_texture_float_linear
WEBKIT_WEBGL_depth_texture
WEBGL_draw_buffers
1 ответ
Вы можете проверить расширение, попросив его
var ext = gl.getExtension("OES_texture_float_linear");
If (!ext) {
alert("extension does not exist");
}
Для three.js вы можете использовать
var gl = renderer.getContext();
Чтобы получить WebGLRenderingContext
В вашем случае, если расширение не существует, рассмотрите возможность использования шейдера bokeh2.
В противном случае, приложение / framework / code сообщит вам, какие расширения необходимы. Я могу думать о 3 способах от макушки
Идеальным способом было бы приложение для конкретных документов, так как в Bokek2 нужны расширения X, Y и Z.
Следующим лучшим способом было бы просто просмотреть код и посмотреть, что он делает.
Другим способом было бы переопределить
getExtension
а затем (1) распечатать, какие расширения проверяются и (2) вернутьnull
для некоторых расширений и посмотреть, когда код не работает.
Я бы действительно предложил № 2 выше, но для № 3 вы могли бы сделать это
(function() {
var originalGetExtensionFunction = WebGLRenderingContext.prototype.getExtension;
// start with this array empty. Once you know which extensions
// the app is requesting you can then selectively add them here
// to figure out which ones are required.
var extensionToReject = [
"OES_texture_float",
"OES_texture_float_linear",
];
WebGLRenderingContext.prototype.getExtension = function() {
var name = arguments[0];
console.log("app requested extension: " + name);
if (extensionToReject.indexOf(name) >= 0) {
console.log("rejected extension: " + name);
return null;
}
var ext = originalGetExtensionFunction.apply(this, arguments);
console.log("extension " + name + " " + (ext ? "found" : "not found"));
return ext;
};
}());