При кодировании в низкоуровневом AGAL, ​​нужно ли вам создавать новые Program3D для текстур? - PullRequest
2 голосов
/ 20 октября 2011

Например ...

Если я разрабатываю приложение, для которого требуется более одной текстуры (в основном, уникальные спрайты), нужно ли мне вызывать context3D.createProgram(); и собрать новый Program3D ( с VertexShaderAssembler и FragmentShaderAssembler) для каждой отдельной текстуры, которую я хочу использовать в приложении?

Как обычно Program3D работает в движке?Одна программа запускает все это или использует одну программу на текстуры , модели , карты ?

И правильно ли я предположить, что вам нужно создавать Program3D только один раз во время инициализации (Event.ADDED_TO_STAGE), а не во время каждого кадра (Event.ENTER_FRAME), верно?

Ответы [ 2 ]

3 голосов
/ 15 ноября 2011

Для одной программы (шейдера) вы можете иметь несколько текстур.Обычно вы пишете программу для каждого имеющегося шейдера.Например, в моей игре у меня есть один шейдер (программа) для освещения местности, текстурирования и раскраски.У меня есть еще один шейдер (программа) для воды.

Итак, программы создаются один раз, но я говорю context3d, какую программу использовать перед рисованием сцены.Таким образом он будет рисовать все, что я собираюсь нарисовать с помощью текущей программы.

Пример использования:

context3d.setProgram(WaterShader);
water.drawTriangles();

context3d.setProgram(TerrainShader)
terrain.drawTriangles();

Сначала я рисую воду, а затем ландшафт, каждый из которых использует свой шейдер.,Мой TerrainShader имеет несколько текстур, например, текстуры песка, камня и грязи.Шейдер решает, какую текстуру использовать в данный момент времени.Например, если высота вершины <10, используйте текстуру песка. </p>

Итак, создайте программы один раз и используйте их при необходимости.

Надеюсь, это поможет вам правильно.

1 голос
/ 20 октября 2011

Вам не нужен новый Program3D для каждой текстуры. Рендерер использует последнюю установленную программу всякий раз, когда вы вызываете drawTriangles (). Если вам нужно по-разному относиться к определенным текстурам таким образом, что вам нужен другой фрагментный шейдер, вам потребуется более одного объекта Program3D, но в редких случаях вам понадобится другой шейдер для каждого объекта и текстуры.

Не написав движка, я не могу вам сказать, как это обычно делается. Я бы подумал, что у вас будут разные объекты Program3D для разных классов моделей, карт среды и т. Д. Вероятно, не один для каждой сущности. Вы ограничены примерно 4000 объектами Program3D.

Да, вам следует заранее создать и инициализировать объекты Program3D. Во время рендеринга вы вызываете Context3D.setProgram (), чтобы указать активную программу. Эта программа используется для рендеринга, пока вы не измените ее.

...