【问题标题】:About GLSL, texture2D() to fetch the texels关于 GLSL,texture2D() 来获取纹素
【发布时间】:2014-04-08 21:20:26
【问题描述】:

我想用下面的代码来模糊一张图片,

{
const GLchar fShaderText[] = FRAGMENT_SHADER_SOURCE
(
 uniform sampler2D imageTexture;
 uniform highp float w0; 
 uniform highp float w1;
 uniform highp float w2;
 uniform highp float w3;
 uniform highp float w4;
 uniform highp float w5;
 uniform highp float w6;

 varying highp vec2 uv0;
 void main()
 {
     highp float u_dx = 1./imageWH.x;
     highp float sum = 0.;
     highp vec4 col = texture2D(imageTexture, uv0);

     sum += texture2D(imageTexture, vec2(uv0.x - 6. * u_dx, uv0.y)).x * w6;
     sum += texture2D(imageTexture, vec2(uv0.x - 5. * u_dx, uv0.y)).x * w5;
     sum += texture2D(imageTexture, vec2(uv0.x - 4. * u_dx, uv0.y)).x * w4;
     sum += texture2D(imageTexture, vec2(uv0.x - 3. * u_dx, uv0.y)).x * w3;
     sum += texture2D(imageTexture, vec2(uv0.x - 2. * u_dx, uv0.y)).x * w2;
     sum += texture2D(imageTexture, vec2(uv0.x - u_dx, uv0.y)).x * w1;
     sum += col.x * w0;
     sum += texture2D(imageTexture, vec2(uv0.x + u_dx, uv0.y)).x * w1;
     sum += texture2D(imageTexture, vec2(uv0.x + 2. * u_dx, uv0.y)).x * w2;
     sum += texture2D(imageTexture, vec2(uv0.x + 3. * u_dx, uv0.y)).x * w3;
     sum += texture2D(imageTexture, vec2(uv0.x + 4. * u_dx, uv0.y)).x * w4;
     sum += texture2D(imageTexture, vec2(uv0.x + 5. * u_dx, uv0.y)).x * w5;
     sum += texture2D(imageTexture, vec2(uv0.x + 6. * u_dx, uv0.y)).x * w6;


     gl_FragColor = vec4(sum, 0., 0., 1.);
 }
 );

// Store the progrm, compute uniform locations
ProgramUniforms &pu = (_programs["HorizontalBlur"] = ProgramUniforms());
pu.program = compileShaders(gVertexShaderText, fShaderText);
pu.uniformMap["mvpMatrix"]    = glGetUniformLocation(pu.program, "mvpMatrix");
pu.uniformMap["imageTexture"] = glGetUniformLocation(pu.program, "imageTexture");
pu.uniformMap["imageWH"]      = glGetUniformLocation(pu.program, "imageWH");

pu.uniformMap["w0"]           = glGetUniformLocation(pu.program, "w0");
pu.uniformMap["w1"]           = glGetUniformLocation(pu.program, "w1");
pu.uniformMap["w2"]           = glGetUniformLocation(pu.program, "w2");
pu.uniformMap["w3"]           = glGetUniformLocation(pu.program, "w3");
pu.uniformMap["w4"]           = glGetUniformLocation(pu.program, "w4");
pu.uniformMap["w5"]           = glGetUniformLocation(pu.program, "w5");
pu.uniformMap["w6"]           = glGetUniformLocation(pu.program, "w6");
}

我想你已经注意到我必须获取相邻的纹素进行计算。

我担心的是,当当前纹素位于边界时,它的一些邻居肯定会在输入图像之外。

那么,texture2d() 也可以返回一个有效值?

【问题讨论】:

    标签: glsl texture2d boundary


    【解决方案1】:

    你应该夹住你的纹理。因此,如果您尝试获取纹理之外的纹素,您实际上会得到边界上最近的纹素。

    钳制纹理比重复它更好,因为这样可以避免纹理两侧的边界不连续。

    看看this link

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-03
      • 2016-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-23
      相关资源
      最近更新 更多