ння. Під фрагментом зображення в даному випадку розуміється піксель, якому зіставлений у відповідність деякий набір атрибутів, таких як колір, глибина, текстурні координати. Піксельний шейдер використовується на останній стадії графічного конвеєра для формування фрагмента зображення.
Шейдер колірної корекції зображення за допомогою градієнтної карти включає в себе наступну послідовність дій:
а) отримання колірного значення необхідного фрагмента з вихідної текстури (по UV-координатам);
б) Покомпонентний колірна корекція кожного кольору вихідного значення та збирання всіх колірних компонент в один вектор кольору (вихідне значення.
Реалізація шейдера колірної корекції за допомогою градієнтної карти виглядає наступним чином:
# version 330 corevec2 UV; vec3 color; sampler2D _MainTex; sampler2D _RampTex; float time; main ()
{inColor=texture (_MainTex, UV);=vec3 (texture (_RampTex, vec2 (inColor.r, 0)). r, (_ RampTex, vec2 (inColor.g, 0)). g,
texture (_RampTex, vec2 (inColor.b, 0)). b);
}
. 1.2 Реалізація шейдера колірної корекції за допомогою тривимірної текстури
Розроблений шейдер також є фрагментних, і працює за наступним алгоритмом:
а) отримання колірного значення необхідного фрагмента з вихідної текстури (по UV-координатам);
б) одержання вихідної колірного значення завдяки використанню вихідного значення в якості координат для тривимірної текстури.
Реалізація шейдера колірної корекції за допомогою тривимірної текстури:
# version 330 corevec2 UV; vec3 color; sampler2D _MainTex; sampler3D _LookupTex; float time; main ()
{inColor=texture (_MainTex, UV) .xyz;=texture (_LookupTex, vec3 (inColor.r, inColor.g, inColor.b)). xyz;
}
3.1.3 Реалізація шейдера колірної корекції з використанням буфера глибини
Алгоритм роботи даного шейдера є найскладнішим і комплексним з усіх, розроблених в рамках дипломного проекту:
а) отримання колірного значення необхідного фрагмента з вихідної текстури (по UV-координатам);
б) отримання значення буфера глибини необхідного фрагмента з текстури буфера глибини (по UV-координатам);
в) лінеаризація буфера глибини;
г) отримання значення колірної корекції на близькій відстані;
д) отримання значення колірної корекції на далекій відстані;
е) змішування значень колірної корекції в потрібному відношенні (на підставі значення буфера глибини).
Реалізація шейдера колірної корекції з використанням буфера глибини виглядає наступним чином:
# version 330 corevec2 UV; vec3 color; sampler2D _MainTex; sampler2D _RampTex; sampler2D _DepthBuffer; sampler2D _DepthRampTex; float time; main ()
{inColor=texture (_MainTex, UV); zValue=texture (_DepthBuffer, UV) .r; linearZ=(2.0/(500 + 0.5 - zValue * (500 - 0.5))); nearColor =vec3 (texture(_RampTex,vec2(inColor.r,0)).r,(_RampTex,vec2(inColor.g,0)).g,(_RampTex,vec2(inColor.b,0)).b);farColor =vec3(texture(_DepthRampTex,vec2(inColor.r,0)).r,(_DepthRampTex,vec2(inColor.g,0)).g,(_DepthRampTex,vec2(inColor.b,0)).b);= vec3 (mix (nearColor, farColor, linearZ));
}
. 2 Реалізація модуля колірної корекції зображення
Розроблений модуль колірної корекції складається з наступних класів:
- TextureLoader - клас завантажує двомірні текстури з файлів у форматах DDS і BMP, а також завантажує тривимірні текстури з файлу в форматі BMP;
- ShaderLoader - клас, що дозволяє завантажити шейдер і надалі використовувати його при виконанні програми;
- ColorCorrection - клас, який надає методи для застосування колірної корекції до зображення.
. 3 Реалізація демонстраційної програми
Демонстраційна програма повинна демонструвати роботи модуля колірної корекції, тому при розробці були реалізовані наступні функції:
- створення вікна OpenGL;
- завантаження тривимірної моделі в сцену;
- накладення на тривимірні моделі текстурних карт і отрисовка тривимірної сцени в текстуру;
- отрисовка довідки;
- отрисовка буфера глибини в текстуру;
- застосування до отриманим текстура...