Применение части текстуры (спрайт-листа / карты текстуры) к точечному спрайту в iOS OpenGL ES 2.0
Кажется, это должно быть легко, но у меня много трудностей с использованием части текстуры с точечным спрайтом. Я много гуглил и нашел разные ответы, но ни один из них не касается конкретной проблемы, с которой я столкнулся.
Что я узнал до сих пор:
Основы точечного спрайтового рисованияКак бороться с точечными спрайтами, которые отображаются сплошными квадратамиКак изменить ориентацию точечного спрайтаКак использовать несколько текстур с точечным спрайтом, приближаясь сюда ..Эта точка спрайты + листы спрайтов уже была сделана, но это возможно только в OpenGL ES 2.0 (не 1.0)Вот схема того, чего я пытаюсь достичь
Где я нахожусь:
У меня есть набор рабочих спрайтов, использующих одно и то же квадратное изображение. Например: изображение круга размером 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);
}
На чем я застрял:
Я не понимаю, как использоватьgl_PointCoord
переменная в фрагменте шейдера. Что значитgl_PointCoord
содержать изначально? Почему? Где он получает свои данные?Я не понимаю, какие координаты текстуры передать. Например, как точечный спрайт выбирает, какую часть моего листа спрайта использовать на основе координат текстуры? Я привык рисовать четырехугольники, которые фактически имеют 4 набора текстурных координат (по одному на каждую вершину), как это отличается (ясно, что это так)?