Применение части текстуры (листа спрайтов/текстурной карты) к точечному спрайту в iOS OpenGL ES 2.0

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

Что я узнал на данный момент:

  1. Основы рисования точечных спрайтов
  2. Как работать с точечными спрайтами, визуализируемыми как сплошные квадраты
  3. Как изменить ориентацию точечного спрайта
  4. Как использовать множественные текстуры с точечным спрайтом, здесь ближе..
  5. Точечные спрайты + листы спрайтов уже делались раньше, но это возможно только в OpenGL ES 2.0 (не 1.0)

Вот диаграмма того, что я Я пытаюсь достичь

Point sprite diagram

Где я нахожусь:

  • У меня есть набор спрайтов рабочих точек, использующих одно и то же квадратное изображение. Например: изображение круга размером 16x16 отлично работает.
  • У меня есть метод Objective-C, который генерирует изображение 600x600, содержащее лист спрайтов с несколькими изображениями. Я убедился, что это работает, применив все изображение листа спрайтов к четырехугольнику, нарисованному с помощью GL_TRIANGLES.
  • Я успешно использовал описанный выше метод для рисования частей листа спрайтов на четырехугольниках. Я просто не могу заставить его работать с точечными спрайтами.
  • В настоящее время я генерирую координаты текстуры, указывающие на центр спрайта на листе спрайтов, на который я ориентируюсь.Например: использование изображения внизу; звезда: 0,166,0,5; облако: 0,5,0,5; сердце: 0,833,0,5.

Код:

Вершинный шейдер

uniform mat4 Projection;
uniform mat4 Modelview;
uniform float PointSize;

attribute vec4 Position;
attribute vec2 TextureCoordIn;

varying vec2 TextureCoord;

void main(void)
{
    gl_Position = Projection * Modelview * Position;
    TextureCoord = TextureCoordIn;
    gl_PointSize = PointSize;
}

Фрагментный шейдер

varying mediump vec2 TextureCoord;
uniform sampler2D Sampler;

void main(void)
{
    // Using my TextureCoord just draws a grey square, so
    // I'm likely generating texture coords that texture2D doesn't like.
    gl_FragColor = texture2D(Sampler, TextureCoord);

    // Using gl_PointCoord just draws my whole sprite map
    // gl_FragColor = texture2D(Sampler, gl_PointCoord);
}

На чем я застрял:

  1. Я не понимаю, как использовать переменную gl_PointCoordво фрагментном шейдере. Что изначально содержит gl_PointCoord? Почему? Откуда он берет свои данные?
  2. Я не понимаю, какие координаты текстуры передавать. Например, как точечный спрайт выбирает, какую часть моего листа спрайтов использовать, на основе координат текстуры? Я привык рисовать четырехугольники, которые фактически имеют 4 набора текстурных координат (по одному на каждую вершину), чем это отличается (очевидно)?

13
задан Community 23 May 2017 в 11:54
поделиться