на OpenFrameworks
Шейдеры
http://pixelnoizz.files.wordpress.com/2009/08/picture-54.png?w=510&h=259
лекции и объявления:
www.uralvision.blogspot.com
Необходимые компоненты:
http://www.youtube.com/watch?v=Nkr4JiU0sF0
Реализуем сглаживание путем наложения друг на друга 9 сдвинутых картинок с разным весом.
Радиус сдвига будет определяться X-координатой мыши.
! Важно: компилятор автоматически не преобразует float <-> int, а выдает про это
предупреждения и шейдер не запускается.
Текст шейдера
Создаем файл вершинного шейдера blur.vert в папке bin/data:
void main() {
gl_TexCoord[0] = gl_MultiTexCoord0;
gl_Position = ftransform();
}
void testApp::setup()
{
ofBackground(255,255,255);
grabber.initGrabber(640, 480); //запуск камеры
void testApp::update()
{
grabber.update(); //обновление картинки с камеры
}
Текст приложения
void testApp::draw()
{
//Сначала заготавливаем картинку - рисуем ее в буфер
buffer.begin();
ofSetColor(255, 255, 255);
grabber.draw(0, 0); //В буфер выводим кадр с камеры
buffer.end();
//Включаем шейдер
shader.setShaderActive(true);
//Устанавливаем параметр шейдера
blurAmount float blurAmount = mouseX / 20.0; //mouseX - текущая координата мыши
shader.setUniformVariable1f("blurAmount", blurAmount); //1f - то есть скаляр типа float
//Выключаем шейдер
shader.setShaderActive(false);
}
Пример 2. Лупа
http://www.youtube.com/watch?v=H-mYdfaku90
в draw()
//Устанавливаем параметры шейдера
shader.setUniformVariable2f("circlePos", mouseX, 480 - mouseY);
shader.setUniformVariable1f("circleRadius", 120);
shader.setUniformVariable1f("zoom", 1.5);
Операции с цветом
заменяем строку
на
1. Вихрь
Сделайте так, чтобы лупа внутри себя закручивала изображение.
2. Вода 1
3. Вода 2
С помощью нажатий мыши имитировать падение чего-то в воду на картинке.
Реализовать это, к примеру, путем моделирования в текстуре амплитуду колебаний
волн.