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