Рендеринг спрайтов от spritesheet с OpenGL?

Они называются анонимными функциями; Вы можете прочитать больше о них здесь:

http://www.ejball.com/EdAtWork/2005/03/28/JavaScriptAnonymousFunctions.aspx

5
задан genpfault 1 May 2019 в 18:01
поделиться

4 ответа

Вы должны начать думать в "пространстве текстуры", где координаты находятся в диапазоне [0, 1].

Итак, если у вас есть лист спрайтов:

class SpriteSheet {
    int spriteWidth, spriteHeight;
    int texWidth, texHeight;

    int tex;

public:
    SpriteSheet(int t, int tW, int tH, int sW, int sH)
    : tex(t), texWidth(tW), texHeight(tH), spriteWidth(sW), spriteHeight(sH)
    {}

    void drawSprite(float posX, float posY, int frameIndex);
};

Все, что у вас есть нужно отправить вершины и вершины текстуры в OpenGL:

    void SpriteSheet::drawSprite(float posX, float posY, int frameIndex) {
        const float verts[] = {
            posX, posY,
            posX + spriteWidth, posY,
            posX + spriteWidth, posY + spriteHeight,
            posX, posY + spriteHeight
        };
        const float tw = float(spriteWidth) / texWidth;
        const float th = float(spriteHeight) / texHeight;
        const int numPerRow = texWidth / spriteWidth;
        const float tx = (frameIndex % numPerRow) * tw;
        const float ty = (frameIndex / numPerRow + 1) * th;
        const float texVerts[] = {
            tx, ty,
            tx + tw, ty,
            tx + tw, ty + th,
            tx, ty + th
        };

        // ... Bind the texture, enable the proper arrays

        glVertexPointer(2, GL_FLOAT, verts);
        glTexCoordPointer(2, GL_FLOAT, texVerts);
        glDrawArrays(GL_TRI_STRIP, 0, 4);
    }

};
8
ответ дан 18 December 2019 в 13:16
поделиться

Я предполагаю, что вы изучаете OpenGL, и вам нужно только заставить его как-то работать. Если вам нужна чистая скорость, есть шейдеры, буферы вершин и всевозможные аккуратные и сложные вещи.

Самый простой способ - загрузить PNG в текстуру (при условии, что у вас есть возможность загружать изображения в память, вам нужен htat), а затем нарисовать его с помощью квадрата, задав соответствующие координаты текстуры (они меняются от 0 до 1 с координаты с плавающей запятой, поэтому вам нужно разделить на ширину или высоту текстуры соответственно).

Используйте glBegin (GL_QUADS), glTexcoord2f (), glVertex2f (), glEnd () для самого простого (но не самого быстрого) способа нарисовать это.

Чтобы обнулить верхний левый угол, либо используйте gluOrtho () для настройки матрица представления отличается от обычного GL (посмотрите документацию для этой функции,

0
ответ дан 18 December 2019 в 13:16
поделиться

Если можно, предложение. Я использую SDL для загрузки своих текстур, поэтому я сделал следующее: 1. Загрузил текстуру 2. Я определил, как разделить таблицу спрайтов на отдельные спрайты. 3. Разделяю их на отдельные поверхности. 4. Я создаю текстуру для каждого из них (у меня есть класс спрайтов для управления ими). 5. Освободите поверхности. Это занимает больше времени (очевидно) на загрузку, но окупается позже. Таким образом, это намного проще (и быстрее), поскольку вам нужно только вычислить индекс текстуры, которую вы хотите отобразить, а затем отобразить ее. Затем вы можете масштабировать / переводить его по своему усмотрению и вызывать список отображения, чтобы отобразить его так, как вы хотите. Или вы можете сделать это в немедленном режиме, либо работает :)

0
ответ дан 18 December 2019 в 13:16
поделиться

Решение Franks уже очень хорошее.

Просто (очень важное) примечание, поскольку некоторые из комментариев предполагают иное.

Пожалуйста, никогда не используйте glBegin / glEnd. Никогда не говорите кому-нибудь использовать его.

Единственный раз, когда можно использовать glBegin / glEnd, - это ваша самая первая программа OpenGL.

Массивы не намного сложнее, но ...

  • ... они быстрее.
  • ... они по-прежнему будут работать с более новыми версиями OpenGL.
  • ... они будут работать с GLES.
  • ... загружать их из файлов намного проще.
]
6
ответ дан 18 December 2019 в 13:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: