Libgdx SpriteBatch.draw() с указанием 4 вершин

Я использую libGdx для создания 2D-игры и пытаюсь использовать этот конкретный метод для рисования простой 2D-текстуры, указав 4 вершины индивидуально;

draw(Texture texture, float[] spriteVertices, int offset, int length)

описание говорит: Рисует прямоугольник, используя заданные вершины. Должно быть 4 вершины, каждая из которых состоит из 5 элементов в следующем порядке: x, y, цвет, u, v.

Другие методы рисования работают нормально, но я не могу заставить работать этот. Что я пытаюсь сделать это;

batch.draw(boxTexture, new float[] {-5, -5, 0, Color.toFloatBits(255, 0, 0, 255), 0, 0, 
                5, -5, 0, Color.toFloatBits(255, 255, 255, 255), 1, 0, 
                5, 5, 0, Color.toFloatBits(255, 255, 255, 255), 1, 1, 
                -5, 5, 0, Color.toFloatBits(255, 255, 255, 255), 0, 1}, 3, 3);

Я не очень хорошо знаком с тем, как работает OpenGL, в частности, какими должны быть смещение и длина. Кто-нибудь более знающий знает, как заставить это работать?

ОБНОВИТЬ:

Работает с мешами, но потом оказывается не было прозрачности, что раздражает. В конце концов, я просто добавил пользовательский метод в SpriteBatch, просто потому, что так проще разобраться. Вершины рисуются по часовой стрелке;

public void drawQuad (Texture texture, float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4, float col) {
        if (!drawing) throw new IllegalStateException("SpriteBatch.begin must be called before draw.");

        if (texture != lastTexture) {
            switchTexture(texture);
        } else if (idx == vertices.length) //
            renderMesh();

        final float u = 0;
        final float v = 1;
        final float u2 = 1;
        final float v2 = 0;

        vertices[idx++] = x1;
        vertices[idx++] = y1;
        vertices[idx++] = col;
        vertices[idx++] = u;
        vertices[idx++] = v;

        vertices[idx++] = x2;
        vertices[idx++] = y2;
        vertices[idx++] = col;
        vertices[idx++] = u;
        vertices[idx++] = v2;

        vertices[idx++] = x3;
        vertices[idx++] = y3;
        vertices[idx++] = col;
        vertices[idx++] = u2;
        vertices[idx++] = v2;

        vertices[idx++] = x4;
        vertices[idx++] = y4;
        vertices[idx++] = col;
        vertices[idx++] = u2;
        vertices[idx++] = v;
    }

person carelesscosmo    schedule 14.08.2012    source источник
comment
Я заметил, что ваш массив с плавающей запятой должен иметь 5 элементов на вершину, но в вашем примере вы указали 6 элементов - x, y, «неизвестно», цвет, u, v - может быть, поэтому это не работает для вас? Кроме того, не уверен, почему ваше смещение/длина указано как 3, 3 - разве вы не должны использовать 0, floatarray.length ? (Я понимаю, что это старый вопрос, но для меня он был в верхней части результатов поиска Google.)   -  person Steve Moseley    schedule 21.01.2019


Ответы (3)


Смещение — это место начала массива (для вас 0), а длина — это количество индексов, через которые должен пройти массив. Для вашего случая: 4 точки, по 5 данных на каждую точку: 4*5 = 20.

Draw никогда не запускал процесс рендеринга, потому что значения 3 float недостаточно для создания треугольника (минимум 15).

Что касается ответа PT, эта конкретная функция выполняет рендеринг вентилятора, поэтому правильный порядок - по часовой стрелке или против часовой стрелки.

Кроме того: порядок, в котором вы размещаете эти точки и текстуры, будет отображать текстуру вверх ногами (я не знаю, было ли это задумано).

person TheDanGau    schedule 12.05.2014

Смещение и длина предназначены для получения среза массива spriteVertices. В вашем случае они должны быть 0 и массив.length (поместите вершины в локальную переменную для вычисления длины).

Кроме того, я не уверен, что это требуется, но я сильно подозреваю, что вершины должны передаваться в треугольнике. В настоящее время вы выполняете перечисление против часовой стрелки. Как правило, для четырехугольников вы должны использовать шаблон Z следующим образом:

3-4
 \
1-2  

(Это связано с тем, что OpenGL берет каждый набор из 3 вершин в списке и визуализирует результирующий треугольник, поэтому вершины 1, 2, 3 и 2, 3, 4 должны образовывать полезные треугольники.)

person P.T.    schedule 15.08.2012
comment
Спасибо, но все равно не повезло. Я заставил его работать, рисуя сетки, так что я собираюсь двигаться в этом направлении. - person carelesscosmo; 16.08.2012

3-4

 \

1-2*

это неправильно, должно быть так:

4-3

1-2
person srul    schedule 30.12.2015