OpenGL纹理像素映射条纹毛刺(不是边框)

时间:2015-12-04 12:29:29

标签: c++ qt opengl textures demosaicing

我正在研究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,size]顶点输入:

centerCoord = vertexIn;

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

0 个答案:

没有答案