Я использую следующий код для объединения нескольких сеток:
import java.util.ArrayList;
import java.util.Arrays;
import org.obsgolem.crystalia.gfx.Renderer;
import com.badlogic.gdx.graphics.Mesh;
import com.badlogic.gdx.graphics.VertexAttribute;
import com.badlogic.gdx.graphics.VertexAttributes.Usage;
import com.badlogic.gdx.math.Vector3;
import com.badlogic.gdx.utils.Array;
import java.util.*;
public class MeshBatch
{
private final static VertexAttribute[] attributeConfig = new VertexAttribute[]{
new VertexAttribute(Usage.Position, 3, "a_position"),
new VertexAttribute(Usage.ColorPacked, 4, "a_color"),
new VertexAttribute(Usage.Normal, 3, "a_normal")};
private final static int VERTEX_SIZE = 3 + 1 + 3;
private Mesh m;
private List<Float> vertices = new ArrayList<Float>();
private List<Short> indices = new ArrayList<Short>();
public void addMesh(float[] vert, short[] ind)
{
int offset = (vertices.size() / VERTEX_SIZE);
//You have to throw an exception when you get over the limit of short indices
if (offset + vert.length / VERTEX_SIZE > Short.MAX_VALUE) {
throw new RuntimeException("blablabla");
}
for (short i : addOffset(ind, offset)) {
indices.add(i);
}
for (float v : vert) {
vertices.add(v);
}
}
public short[] addOffset(short[] ind, int offset)
{
short[] indarr = new short[ind.length];
for (int i = 0; i < ind.length; ++i) {
//Do you really need this check? You are the only one using this code
//so make sure that you never provide a null value. If you really want to have a chekc throw an exception instead
short value = ind[i];//ind[i] == null ? 0 : ind[i];
indarr[i] = (short) (value + offset);
}
return indarr;
}
public void end()
{
m = new Mesh(false, vertices.size(), indices.size(), attributeConfig);
m.setVertices(Renderer.makeFloatArray(vertices));
m.setIndices(Renderer.makeShortArray(indices));
}
public void render()
{
Renderer.getInstance().render(m);
}
}
Однако когда я рисую с помощью этого класса, я получаю странные эффекты освещения. С этим мешем свет ярче для всех других объектов, в то время как тот, который визуализируется, имеет освещение, которое выглядит плоским. Обычным способом (отдельные сетки для каждого объекта) я получаю приятное гладкое освещение. Вот два скриншота, которые я сделал:
С объединенной сеткой:
Без объединенной сетки:
Что вызывает эту проблему и как она может повлиять на освещение другого меша? Мои вершины отправляются в правильном формате (3 поплавка для вершин, 1 для цвета и 3 для нормалей). Мои индексы тоже работают. Проблема возникает только тогда, когда сетка фактически визуализируется. Без него освещение работает отлично. Я думаю, что проблема как-то связана с нормалями, но я не могу понять, что это может быть за проблема.
Редактировать: кажется, проблема решена. Когда я переключил плитки с использования отдельных сеток на сетку, освещение исправилось само. Как такое могло произойти?