Подготовку проекта в 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 )
Рассмотрим пиксельный шейдер "Хроматическая аберрация" для 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);
}
{
...
}
Результатом работы шейдера должен быть 4-компонентный вектор, который записывается в переменную gl_FragColor.
Пример минимального шейдера, который будет просто отображать текстуру, которую ему передадим:
uniform sampler2D texture0;
varying mediump vec2 uvVarying;
void main()
{
gl_FragColor = texture2D(texture0, uvVarying);
}
Все остальное - это фантазия программиста, который пишет шейдер!
Комментариев нет:
Отправить комментарий