关于GLSL,texture2D()获取纹理

关于GLSL,texture2D()获取纹理,glsl,texture2d,boundary,Glsl,Texture2d,Boundary,我想用下面的代码模糊图像 { 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 w

我想用下面的代码模糊图像

{
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也可以返回一个有效值?

您应该钳制您的纹理。因此,如果您尝试获取纹理外部的纹理,您实际上会获得边界上最近的纹理

与其重复纹理,不如钳制纹理,因为这样可以避免纹理对边边界处的不连续性

看一看