Точечный свет libgdx не работает на сгенерированной сетке - программирование
Подтвердить что ты не робот

Точечный свет libgdx не работает на сгенерированной сетке

Я пытаюсь осветить плоские сетки, созданные следующим образом:

private Model createPlane(float w, float h, Texture texture) {
   Mesh mesh = new Mesh(true, 4, 6, new VertexAttribute(Usage.Position, 3, "a_position"),
           new VertexAttribute(Usage.TextureCoordinates, 2, "a_texCoord0"),
           new VertexAttribute(Usage.Normal, 3, "a_normal")); 

   float w2 = w * this.CELL_SIZE;
   float h2 = h * this.CELL_SIZE;

    mesh.setVertices(new float[]
            { w2, 0f, h2, 0, 0, 0, 1, 0,
            w2, 0f, -h2, 0, h, 0, 1, 0,
            -w2, 0f, h2, w, 0, 0, 1, 0,
            -w2, 0f, -h2 , w,h, 0, 1, 0
            });
    mesh.setIndices(new short[] { 0, 1, 2, 1, 3, 2});
    Model model = ModelBuilder.createFromMesh(mesh, GL10.GL_TRIANGLES, new Material(TextureAttribute.createDiffuse(texture)));
    return model;
}

и отображаются с помощью:

//the environment setup
env = new Environment();
        env.set(new ColorAttribute(ColorAttribute.AmbientLight, 0.4f, 0.4f, 0.4f, 1f));
        env.add(new PointLight().set(Color.ORANGE, 5f, 1f, 5f, 10f));
        env.add(new DirectionalLight().set(Color.WHITE, -1f, -0.8f, -0.2f));
...
//the render method
batch.begin();
batch.render(inst, env);//inst is a ModelInstance created using the Model generated from createPlane(...)
batch.end();

Ячейки отображаются корректно (UVs, текстурированы) и, как представляется, правильно влияют на направленное и окружающее освещение.

Когда я пытаюсь добавить точечный свет (см. выше окружение), ни один из плоскостей, сгенерированных из createPlane (...), не будет затронут. Я попытался создать еще один бит геометрии, используя класс ModelBuilder createBox (...), и он, похоже, правильно реагирует на точечный свет. Из-за этого я предполагаю, что я не правильно создаю самолет, но тот факт, что он, по-видимому, подвергается воздействию направленного/окружающего света, немного отбрасывает меня.

Стоит отметить, что размер создаваемых плоскостей меняется, я не особо уверен, что точечный свет очень сильно повлияет на 4 вершины, но я ожидал большего, чем ничего. Перемещение точечного света вокруг (ближе к определенным вершинам) тоже ничего не делает.

Любая помощь будет принята с благодарностью.

Спасибо!

4b9b3361

Ответ 1

Было бы здорово узнать, какой шейдер вы используете. По умолчанию? Я не уверен, что они уже исправили это, у них была ошибка некоторое время назад, когда pointlightning работал только на некоторых устройствах (это было связано с реализацией оппонентов со стороны производителя. Я лично исправил это, используя свой собственный шейдер.

Изменить: Это кажется исправленным

Я проверил код, который я использую. Проблема заключалась в том, чтобы определить правильный световой массив в шейдере. Вроде ли это так:

    // on some devices this was working
    int u_lightPosition = program.getUniformLocation("u_lightPosition[0]");
    int u_lightColors = program.getUniformLocation("u_lightColor[0]");
    if(u_lightPosition < 0 && u_lightColors < 0) {
        // on others this was working
        u_lightPosition = program.getUniformLocation("u_lightPosition");
        u_lightColors = program.getUniformLocation("u_lightColor");
    }

Надеюсь, это поможет!