Я следил за this tutorial с помощью Apple OpenGL Shader Builder (инструмент похож на Nvidia fx composer, но проще).Блочные фильтры с использованием фрагментарных шейдеров
Я мог бы легко применять фильтры, но я не понимаю, правильно ли они работали (и если да, то как я могу улучшить выход). Например, фильтр размытия: сам OpenGL выполняет некоторую обработку изображений на текстурах, поэтому, если они отображаются с более высоким разрешением, чем исходное изображение, они уже размыты OpenGL. Во-вторых, размытая часть ярче, чем часть, не обработанная, я думаю, что это не имеет смысла, поскольку она просто берет пиксели из прямого соседства. Это определяется как
float step_w = (1.0/width);
Который я не совсем понимаю: пиксели индексируются с использованием значений с плавающей запятой ??
Blurred Image http://img218.imageshack.us/img218/6468/blurzt.png
Edit: Я забыл прикрепить точный код я использовал:
пиксельный шейдер
// Originally taken from: http://www.ozone3d.net/tutorials/image_filtering_p2.php#part_2
#define KERNEL_SIZE 9
float kernel[KERNEL_SIZE];
uniform sampler2D colorMap;
uniform float width;
uniform float height;
float step_w = (1.0/width);
float step_h = (1.0/height);
// float step_w = 20.0;
// float step_h = 20.0;
vec2 offset[KERNEL_SIZE];
void main(void)
{
int i = 0;
vec4 sum = vec4(0.0);
offset[0] = vec2(-step_w, -step_h); // south west
offset[1] = vec2(0.0, -step_h); // south
offset[2] = vec2(step_w, -step_h); // south east
offset[3] = vec2(-step_w, 0.0); // west
offset[4] = vec2(0.0, 0.0); // center
offset[5] = vec2(step_w, 0.0); // east
offset[6] = vec2(-step_w, step_h); // north west
offset[7] = vec2(0.0, step_h); // north
offset[8] = vec2(step_w, step_h); // north east
// Gaussian kernel
// 1 2 1
// 2 4 2
// 1 2 1
kernel[0] = 1.0; kernel[1] = 2.0; kernel[2] = 1.0;
kernel[3] = 2.0; kernel[4] = 4.0; kernel[5] = 2.0;
kernel[6] = 1.0; kernel[7] = 2.0; kernel[8] = 1.0;
// TODO make grayscale first
// Laplacian Filter
// 0 1 0
// 1 -4 1
// 0 1 0
/*
kernel[0] = 0.0; kernel[1] = 1.0; kernel[2] = 0.0;
kernel[3] = 1.0; kernel[4] = -4.0; kernel[5] = 1.0;
kernel[6] = 0.0; kernel[7] = 2.0; kernel[8] = 0.0;
*/
// Mean Filter
// 1 1 1
// 1 1 1
// 1 1 1
/*
kernel[0] = 1.0; kernel[1] = 1.0; kernel[2] = 1.0;
kernel[3] = 1.0; kernel[4] = 1.0; kernel[5] = 1.0;
kernel[6] = 1.0; kernel[7] = 1.0; kernel[8] = 1.0;
*/
if(gl_TexCoord[0].s<0.5)
{
// For every pixel sample the neighbor pixels and sum up
for(i=0; i<KERNEL_SIZE; i++)
{
// select the pixel with the concerning offset
vec4 tmp = texture2D(colorMap, gl_TexCoord[0].st + offset[i]);
sum += tmp * kernel[i];
}
sum /= 16.0;
}
else if(gl_TexCoord[0].s>0.51)
{
sum = texture2D(colorMap, gl_TexCoord[0].xy);
}
else // Draw a red line
{
sum = vec4(1.0, 0.0, 0.0, 1.0);
}
gl_FragColor = sum;
}
Vertex Shader
void main(void)
{
gl_TexCoord[0] = gl_MultiTexCoord0;
gl_Position = ftransform();
}
что еще вопрос? координаты текстуры адресуются в диапазоне [0-1], да. – Bahbar