Я работаю над алгоритмами демозаики OpenGL Bayer, и, хотя мне, похоже, удалось заставить эти методы работать, я иногда получаю сбои в выводе и не могу понять, почему. Смотрите изображения здесь: https://imgur.com/a/gz5YL. Полосы встречаются только на определенных масштабах поверхности, на большинстве масштабов (возможно, на 99%) никаких глюков нет.
Вершинный шейдер:
vec2 invTexSize = 1.0/texSize;
centerCoord = floor(vertexIn*texSize) + 0.5;
centerTexCoord = centerCoord * invTexSize;
Xoffsets = centerTexCoord.x + vec2(-invTexSize.x, invTexSize.x);
Yoffsets = centerTexCoord.y + vec2(-invTexSize.y, invTexSize.y);
gl_Position = mvp_matrix * vec4(vertexIn.xy,0.0,1.0);
Фрагмент шейдера:
float center = texture2D(source, centerTexCoord).r;
vec4 diags = vec4(
texture2D(source, vec2(Xoffsets.x, Yoffsets.x)).r, // (-1,-1)
texture2D(source, vec2(Xoffsets.x, Yoffsets.y)).r, // (-1, 1)
texture2D(source, vec2(Xoffsets.y, Yoffsets.x)).r, // ( 1,-1)
texture2D(source, vec2(Xoffsets.y, Yoffsets.y)).r); // ( 1, 1)
vec2 horiz = vec2(
texture2D(source, vec2(Xoffsets.x, centerTexCoord.y)).r, // (-1, 0)
texture2D(source, vec2(Xoffsets.y, centerTexCoord.y)).r); // ( 1, 0)
vec2 vertic = vec2(
texture2D(source, vec2(centerTexCoord.x, Yoffsets.x)).r, // ( 0,-1)
texture2D(source, vec2(centerTexCoord.x, Yoffsets.y)).r); // ( 0, 1)
float GREEN4 = (horiz.x + horiz.y + vertic.x + vertic.y)/4.0;
float DIAG4 = (diags.x + diags.y + diags.z + diags.w)/4.0;
float H2 = (horiz.x + horiz.y)/2.0;
float V2 = (vertic.x + vertic.y)/2.0;
// Branching
vec2 branch = mod(floor(centerCoord), 2.0);
gl_FragColor.rgb = ( branch.y == 0.0) ?
(( branch.x == 0.0) ?
vec3(center,GREEN4,DIAG4) :
vec3(H2,center,V2)) :
(( branch.x == 0.0) ?
vec3(V2,center,H2) :
vec3(DIAG4,GREEN4,center));
Вершины определяются как
float vertices[] = {0.0f, 0.0f,
0.0f, 1.0f,
1.0f, 0.0f,
1.0f, 1.0f};
Фильтры установлены в GL_NEAREST. texSize — размер загруженного изображения текстуры в пикселях. Просто для удобства (?) Я использую те же координаты вершины и текстуры [0,1], и mvp настроен соответственно для сохранения соотношения сторон. Я использую Qt5.5 MSVC32, и глюки были воспроизведены на совершенно другом оборудовании.
Я играл со многими различными методами отображения (корректировка координат текстуры и т. Д.). Некоторые из них, кажется, дают лучшие результаты (реже сбои), чем другие, и из-за этого я думаю, что причиной может быть что-то вроде недостаточно точных текстурных координат. В какой-то момент, по крайней мере, я подумал, что проблема исчезла, когда я не использовал mvp для поддержания соотношения сторон, но я просто представлял, может ли это изменить ситуацию?
Есть идеи, что может быть причиной этого?
Некоторая часть кода обязана графике graphics.cs.williams.edu/papers/BayerJGT09/
Образец изображения CFA находится на сайте www.cs.unc.edu/~lazebnik/spring09/assignment1.html.
ОБНОВЛЕНИЕ 6.12.2015:
Скрестив пальцы, я думаю, что добился хорошего прогресса, выбирая с помощью ненормализованных координат текстуры
texelFetch(source, ivec2(x, y), 0).r
вместо texture / texture2D. Я отменил все настройки текстурных координат в стиле фанк и передал вершины [0, размер] в:
centerCoord = vertexIn;
Первоначальные тесты показывают хорошие результаты — посмотрим, преждевременно ли это. И даже если бы это было решением, я все еще не понимаю, почему я не смог поразить тексели с нормализованными координатами.
Задача ещё не решена.
Других решений пока нет …