1

我正在研究 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

而不是纹理/纹理2D。我恢复了所有时髦的纹理坐标调整,并将 [0, size] 顶点输入:

centerCoord = vertexIn;

初步测试显示出良好的结果——我们会看看它是否为时过早。即使这是解决方案,我仍然不明白为什么我无法使用归一化坐标击中纹素。

4

0 回答 0