среда, 24 января 2018 г.

Структура пиксельного шейдера на примере еффекта "Хроматическая аберрация"

Подготовку проекта в AGK смотрите ЗДЕСЬ.

Рассмотрим пиксельный шейдер "Хроматическая аберрация" для App Game Kit на языке GLSL:

uniform sampler2D texture0;

varying mediump vec2 uvVarying;

uniform vec2 agk_resolution;
uniform float agk_sintime;
uniform float agk_time;

void main()
{
vec2 scale = 1.0/agk_resolution;
vec4 color = vec4(texture2D(texture0, uvVarying ).rgba);
vec2 UV_MOD=vec2(3.0*agk_sintime*agk_sintime , 0.0 );
color.r = texture2D(texture0, uvVarying+UV_MOD*scale).r;

gl_FragColor = color;
}

РАЗБОР АЛГОРИТМА ХРОМАТИЧЕСКОЙ АБЕРРАЦИИ

Все переменные у которых перед их типом находится слово uniform передаются шейдеру из самой програмы. Их может менять пользователь во время выполнения игры с помощью команд:
SetShaderConstantByName( shaderID, szName, value1, value2, value3, value4 ) SetShaderConstantArrayByName( shaderID, szName, arrayIndex, value1, value2, value3, value4 )

uniform sampler2D texture0 - это текстура которую мы передали в шейдер командой SetObjectImage( quad, render_image, 0 ) в самой программе. Если нужно передать еще текстуру, то нужно записать в AGK SetObjectImage( quad, render_image_2, 1 ), а в шейдере дописать строку uniform sampler2D texture1. Будет вот так:
...
uniform sampler2D texture0;
uniform sampler2D texture1;
...
varying mediump vec2 uvVarying - это UV координаты текстуры, которые передаются с вертексного шейдера (хотя мы его и не определяли, но он есть!). Эти координаты менять нельзя (как и все varying переменные), только считывать, иначе будет ошибка компиляции шейдера. 
agk_resolution, agk_sintime, agk_time - это переменные которые AGK самостоятельно передает в шейдер, но объявлять их в самом шейдере нужно самостоятельно (все они, естественно, uniform).
И сама функция входа:
void main()
{
...
}

Результатом работы шейдера должен быть 4-компонентный вектор, который записывается в переменную gl_FragColor.
Пример минимального шейдера, который будет просто отображать текстуру, которую ему передадим:

uniform sampler2D texture0;
varying mediump vec2 uvVarying;

void main()
{
gl_FragColor = texture2D(texture0, uvVarying);
}

Все остальное - это фантазия программиста, который пишет шейдер!


Комментариев нет:

Отправить комментарий