WebGL: как эффективно извлекать / кэшировать шейдеры? - PullRequest
2 голосов
/ 10 мая 2011

В настоящее время я занимаюсь разработкой приложения на основе WebGL, и у меня возникают некоторые проблемы с хранилищем шейдеров…

В большинстве примеров я вижу, что шейдеры записываются в виде открытого текста в самом файле xHTML.Однако это загромождает файл и не разрешает кэширование.Кроме того, их неудобно редактировать и использовать повторно.Наличие одного файла на шейдер является лучшим для организации.Я все еще могу вставить их с помощью PHP в сгенерированный вывод, но это увеличивает размер страниц и не может эффективно кэшироваться.

Другое решение - это выборка каждого шейдера с помощью XmlHttpRequest, но ябоюсь, что количество HTTP-запросов на загрузку новой страницы (особенно если у вас десятки шейдеров!) может быстро стать проблемой производительности.

Наконец, я подумал о том, чтобы динамически поместить все шейдеры в файлзатем загрузите его с помощью XmtHttpRequest.Это только один запрос для одного файла, который может кэшироваться локально браузером.Тем не менее, мой JS не так хорош, и я не знаю, как мне это сделать.Я собирал файл из шейдеров в PHP и извлекал их в Javascript.

Но как?Я думал об использовании XML или JSON для хранения заголовков в большом файле, и мне нужна помощь по коду Javascript для их извлечения.Спасибо!

Мой сгенерированный PHP файл шейдера будет выглядеть так:

<vertex-shader id="shaderA">
    …shader code…
</vertex-shader>
<fragment-shader id="shaderB">
    …etc…
</fragment-shader>

Или:

{ "vertexshaderA": "…shader code…",
  "fragmentshaderA": "…etc…" }

1 Ответ

1 голос
/ 18 мая 2011

Вы можете использовать библиотеку PHP JSON. Прочитайте все файлы шейдеров, затем создайте ассоциативный массив из них и используйте функцию json_encode для создания объекта JSON.

$arr = array ('vertexShaderA'=>code,'vertexShaderB'=>code);
echo json_encode($arr);

Затем используйте XmlHttpRequest в JS, чтобы получить объект JSON. Или используйте PHP, чтобы сгенерировать файл JS, который устанавливает глобальный (например, echo "Shaders =", json_encode($shaders)), и включите его, используя тег .

...