Обнаружение необходимых расширений WebGL

Я работаю над приложением WebGL (использующим ThreeJs), которое, очевидно, показывает 3D-модели, и мы используем некоторые эффекты (шейдеры), пытаясь сделать тест, чтобы узнать, может ли пользователь запустить приложение или нет, я нахожу способ получить список поддерживаемых плагинов в используемом браузере.

Вопрос:

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


Больше деталей:

для дальнейших деталей я бы указал пример того, что мне нужно:

  1. В моем MacBook Pro под Mac OSX Maverix приложение работает нормально
  2. Тестирование приложения на моем ноутбуке 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 способах от макушки

  1. Идеальным способом было бы приложение для конкретных документов, так как в Bokek2 нужны расширения X, Y и Z.

  2. Следующим лучшим способом было бы просто просмотреть код и посмотреть, что он делает.

  3. Другим способом было бы переопределить 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;
  };

}());
Другие вопросы по тегам