Другими словами, какова лучшая практика рендеринга частей модели в подсистеме рендеринга Эшли?
Вначале ставятся любые визуальные эффектыМаксимально возможная обработка в шейдере.Производительность этого лучше, потому что они обрабатываются в GPU.Примеров, подобных этому, есть в three.js и shadertoy.
Чтобы сделать это в Эшли, я могу использовать компонент со всеми параметрами, отправляемыми в GPU, перед рендерингом любого меша.Таким образом, подсистема рендеринга будет выглядеть так:
public class SysDynamicRender extends IteratingSystem {
ShaderProgram program;
private void initShader() {
program = new ShaderProgram("vert", "frag");
// variables only about the shader program, not about meshes
u_projTrans = program.getUniformLocation("u_projTrans");
u_worldTrans = program.getUniformLocation("u_worldTrans");
u_colorLoc = program.getUniformLocation("u_color");
texBase = new Texture("data/modlib/color-blocks.jpg");
}
@Override
protected void processEntity(Entity entity, float deltaTime) {
// in Ashley, we only get meshparts from entity
renderQueue.add(entity);
}
@Override
public void update(float deltaTime) {
super.update(deltaTime);
// render
for (Entity e : renderQueue) {
// way 1: use the help of ModelBatch
CmpModelInst cmpModelInst = e.getComponent(CmpModelInst.class)
modelBatch.render(cmpModelInst.inst(), shader);
// way 2: rendering meshpart directly (not work)
// 2.1 get the Renderable (out)
DynaAttr attr = e.getComponent(CmpVisuals.class).attr;
ModelInstance inst = cmpModelInst.class).inst();
Node n = inst.getNode("cube1_cube1_auv");
out = inst.getRenderable(out, n);
// 2.2 rendert meshpart with shader program
program.setUniformMatrix(u_worldTrans, out.worldTransform);
program.setUniformf(u_colorLoc, attr.effects());
program.setUniformf(u_factorLoc, attr.u_factorF());
out.meshPart.render(program);
}
renderQueue.clear();
}
}
Я думаю, что должен быть лучший способ реализовать update ().
Вопрос в том, что это?
Или есть какой-нибудь пример рендеринга 3d-моделей Эшли?
Параметры визуальных эффектов, такие как цвет, углы отражения (для разных цветов), являются атрибутами шейдеров.они не должны обновляться при каждом вызове рендеринга итерации по сеточным частям.Это затраты на производительность, потому что ЦПУ необходимо отправить данные в графический процессор - если я правильно понимаю.
Эшли предоставила схему для решения этой проблемы.Просто реализуйте динамический шейдер и поместите ссылочный компонент в сущность, позвольте Эшли вызвать правильную подсистему.
Таким образом, ModelBatch не должен подходить?ModelBatch.flush () просто перебирает свои части.
Ссылка:
ModelBatch.java: https://github.com/libgdx/libgdx/blob/master/gdx/src/com/badlogic/gdx/graphics/g3d/ModelBatch.java
wiki: https://github.com/libgdx/libgdx/wiki/ModelBatch
Что-то я не понимаю?