Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL纹理像素映射条纹瑕疵(非边框)_C++_Qt_Opengl_Textures_Demosaicing - Fatal编程技术网

C++ OpenGL纹理像素映射条纹瑕疵(非边框)

C++ OpenGL纹理像素映射条纹瑕疵(非边框),c++,qt,opengl,textures,demosaicing,C++,Qt,Opengl,Textures,Demosaicing,我正在研究OpenGL拜耳去马赛克算法,虽然我已经设法使这些技术看起来可行,但我在输出中偶尔会遇到小故障,我似乎不知道为什么。请参见此处的图像:。条纹仅出现在表面的某些刻度上,在大多数刻度上(可能99%)没有小故障 顶点着色器: vec2 invTexSize = 1.0/texSize; centerCoord = floor(vertexIn*texSize) + 0.5; centerTexCoord = centerCoord * invTexSize; Xoffsets = cent

我正在研究OpenGL拜耳去马赛克算法,虽然我已经设法使这些技术看起来可行,但我在输出中偶尔会遇到小故障,我似乎不知道为什么。请参见此处的图像:。条纹仅出现在表面的某些刻度上,在大多数刻度上(可能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_。texSize是上载纹理图像的大小(以像素为单位)。为了方便(?)我使用相同的顶点和纹理坐标[0,1],mvp相应地配置为正交,以保持纵横比。我使用的是Qt5.5 MSVC32,这些小故障已经在完全不同的硬件上重现

我使用过许多不同的贴图技术(调整纹理坐标等)。它们中的一些似乎比其他的产生更好的结果(较少出现小故障),因此我认为原因可能是纹理坐标不够精确。至少在某一点上,当我没有使用mvp来保持纵横比时,我认为问题已经解决了,但我只是在想象,这会有所不同吗

你知道是什么引起的吗

一些代码归功于graphics.cs.williams.edu/papers/BayerJGT09/

示例CFA图像来自www.cs.unc.edu/~lazebnik/spring09/assignment1.html

2015年12月6日更新: 我在这里祈祷,但我认为我通过使用非标准化纹理坐标进行获取取得了很好的进展

texelFetch(source, ivec2(x, y), 0).r
而不是纹理/纹理2D。我恢复了所有时髦的纹理坐标调整,并将[0,大小]顶点输入:

centerCoord = vertexIn;
最初的测试显示了良好的结果,我们将看看这是否为时尚早。即使这是解决方案,我仍然不明白为什么我不能用标准化坐标击中纹理