Кажется, это должно быть легко, но я испытываю большие трудности, используя часть текстуры с помощью точечного спрайта. Я широко разошёл по всему миру и получил различные ответы, но ни одна из них не касается конкретной проблемы, которую я испытываю.
Что я узнал до сих пор:
- Основы создания точечного спрайта
- Как обрабатывать точечные спрайты как сплошные квадраты
- Как изменить ориентацию точечного спрайта
- Как использовать несколько текстур с помощью точечного спрайта, приближаясь сюда..
- Этот точечный спрайт + листы спрайтов были выполнены раньше, но это возможно только в OpenGL ES 2.0 (не 1.0).
Вот схема того, что я пытаюсь достичь
Где я нахожусь:
- У меня есть набор спрайтов рабочей точки, которые используют один и тот же квадратный образ. Например: изображение круга размером 16x16 отлично работает.
- У меня есть метод Objective-C, который генерирует изображение 600x600, содержащее спрайт-лист с несколькими изображениями. Я проверил, что это работает, применяя весь образ листа спрайта к квадру, нарисованному с помощью GL_TRIANGLES.
- Я использовал этот метод успешно, чтобы нарисовать части листа спрайтов на квадрациклах. Я просто не могу заставить его работать с точечными спрайтами.
- В настоящее время я создаю текстурные координаты, указывающие на центр спрайта на листе спрайта, на который я нацеливаюсь. Например: использование изображения внизу; звезда: 0,166,0,5; облако: 0,5,0,5; сердце: 0,833,0,5.
Код:
Vertex Shader
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 набора координат текстуры (по одной для каждой вершины), как это отличается (очевидно, это так)?