Буфер кадра
Буфер кадра позволяет вам рисовать не только на экране, но и прямо на текстуре в видео-памяти применяя при этом те же функции рисования.
Создать буфер кадра можно функцией createFramebuffer, которая возвращает значение типа Framebuffer, которое по сути является адресом в памяти — указателем на описание буфера кадра внутри библиотеки Helianthus. Количество буферов кадра с которыми вы можете одновременно работать и их максимальные размеры зависят от вашего видео-драйвера.
После создания буфера кадра в можете создать связанную с ним однокадровую анимацию при помощи функции createAnimationFromFramebuffer. Это будет не простая анимация — изображение в ней будет изменяться как только вы что-либо нарисуете на вашем буфере кадра.
Для того чтобы начать рисовать на буфере кадра вам нужно вызвать функцию target. После завершение рисования вы можете снова вернуться к рисованию на экране обратившись к функции noTarget.
Функции:
Framebuffer createFramebuffer(int width, int height);
Создаёт буфер кадра заданных размеров со включенным сглаживанием, но с выключенным повторением текстуры по горизонтали и вертикали. См. также createFramebufferEx, createAnimationFromFramebuffer, target.
Параметры:
width — ширина нового буфера кадра в пикселях;
height — высота нового буфера кадра в пикселях.
Framebuffer createFramebufferEx(int width, int height, const void *pixels, int horWrap, int vertWrap, int smooth);
Создать буфер кадра с расширенным набором настроек. См. также createFramebuffer, createFramebufferFromFile, createAnimationFromFramebuffer, target.
Параметры:
width — ширина нового буфера кадра в пикселях;
height — высота нового буфера кадра в пикселях;
pixels — указатель на массив пикселей (смотрите формат в описании функции imageLoad), которые зададут начальное изображение буфера кадра; этот параметр может быть NULL, буфер будет заполнен прозрачными писелями;
horWrap — включить горизонтальное повторение для текстуры созданной на основе буфера кадра (TRUE или FALSE);
vertWrap — включить вертикальное повторение для текстуры созданной на основе буфера кадра (TRUE или FALSE);
smooth — включить сглаживание (билинейная фильтрация) для текстуры созданной на основе буфера кадра (TRUE или FALSE).
Framebuffer createFramebufferFromFile(const char *path);
Создать буфер кадра на основе изображения загруженного из файла. Размеры буфера будут соответствовать размеру изображения и само изображение будет загружено в буфер кадра в качестве его начального состояния. Будет включено сглаживание, но отключено повторение узора текстуры по горизонтали и вертикали.
Параметры:
path — путь к файлу изображения.
void framebufferDestroy(Framebuffer framebuffer);
Удалить буфер кадра. См. также createFramebuffer.
Важно: Скорее всего у вас в программе останется переменная в которой хранился указатель на буфер кадра. Этот указатель станет недействителен — будет указывать на неопределённую область памяти — не на буфер кадра, буфер удалён. Вы можете занести в эту переменную другой буфер кадра, но использовать старое значение переменной больше нельзя это приведёт у ошибкам и непредсказуемому поведению программы.
void framebufferFlush(Framebuffer framebuffer);
Видео-драйвер обычно выполняет рисование не в тот момент, когда вы отправляете соответствующую команду, а откладывает этот процесс до тех под пока операционная система не затребует отобразить результат рисования на экране.
Данная функция заставляет видео-драйвер завершить все операции немедленно. Обычно вам не нужно будет её использовать, везде где это требуется Helianthus сделает это за вас. Однако, эта функция вам может понадобиться если вы используете функции OpenGL напрямую, минуя функции рисования библиотеки Helianthus.
int framebufferGetWidth(Framebuffer framebuffer);
Возвращает ширину буфера кадра в пикселях. См. также framebufferGetHeight.
int framebufferGetHeight(Framebuffer framebuffer);
Возвращает высоту буфера кадра в пикселях. См. также framebufferGetWidth.
unsigned int framebufferGetGLTexId(Framebuffer framebuffer);
Возвращает внутренний идентификатор текстуры OpenGL связанной с буфером кадра. См. также framebufferGetGLId, framebufferFlush.
unsigned int framebufferGetGLId(Framebuffer framebuffer);
Возвращает внутренний идентификатор буфера кадра OpenGL. См. также framebufferGetGLTexId, framebufferFlush.
void projectionByViewport();
Устанавливает матрицу проекции OpenGL таким образом, чтобы начало координат было в верхнем левом углу области вывода OpenGL, а единичный отрезок соответствовал размеру пикселя. См. также targetEx.
void viewportByFramebuffer(Framebuffer framebuffer);
Устанавливает область вывода OpenGL на всю площадь заданного буфера кадра. См. также targetEx.
void viewportByWindow();
Устанавливает область вывода OpenGL на всю площадь окна. См. также targetEx.
void targetEx(Framebuffer framebuffer, int updateViewport, int updateProjection);
Устанавливает текущую область рисования. Если framebuffer не NULL, то рисование будет производиться на буфере кадра, иначе на окне. Параметры updateViewport и updateProjection позволяют вам отключить изменение области вывода OpenGL и матрици проекции соответственно. См. также target, noTarget, viewportByFramebuffer, viewportByWindow, projectionByViewport.
Параметры:
framebuffer — буфер кадра, если NULL, то окно программы будет выбрано в качестве целевого холста для рисования;
updateViewport — задать область вывода OpenGL соответствующую новому целевому холсту (TRUE или FALSE, см. viewportByFramebuffer, viewportByWindow);
updateProjection — задать матрицу проекции OpenGL соответствующую новой области вывода (TRUE или FALSE, см. projectionByViewport), игнорируется если updateViewport выключен.
void target(Framebuffer framebuffer);
Функция выбирает буфер кадра в качестве целевого холста для рисования. Последующие операции рисование будет проводиться на данном буфере кадра. Если вы будете работать с функциями OpenGL напрямую, минуя функции рисования Helianthus, то вам необходимо знать, что данная функция меняет область вывода (glViewport) и матрицу проекции OpenGL.
См. также noTarget, targetEx, saveState, restoreState.
Параметры:
framebuffer — буфер кадра, если NULL, то окно программы будет выбрано в качестве целевого холста для рисования
void noTarget();
Выбрать окно программы в качестве целевого холста для рисования. См. также target, saveState, restoreState.