Подходит ли libgdx ModelBatch для Эшли? - PullRequest
0 голосов
/ 26 декабря 2018

Другими словами, какова лучшая практика рендеринга частей модели в подсистеме рендеринга Эшли?

  • Вопрос в деталях:

Вначале ставятся любые визуальные эффектыМаксимально возможная обработка в шейдере.Производительность этого лучше, потому что они обрабатываются в 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

Что-то я не понимаю?

...