Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.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
Cocos2d iphone 如何防止模糊使用纹理之外的颜色?_Cocos2d Iphone_Opengl Es 2.0_Shader - Fatal编程技术网

Cocos2d iphone 如何防止模糊使用纹理之外的颜色?

Cocos2d iphone 如何防止模糊使用纹理之外的颜色?,cocos2d-iphone,opengl-es-2.0,shader,Cocos2d Iphone,Opengl Es 2.0,Shader,我正在尝试创建一个模糊的着色器,我已经做到了。然而,有一个问题。纹理周围有一个黑色背景,当着色器运行时,它会从该背景中获取颜色,并最终使整个图像变暗(但它仍然会很好地模糊图像,就好像它也在降低亮度一样)。为了确定这就是我所想的,我将背景设置为白色,这确实使我的图像更加暗淡。我真的不知道如何防止这种情况,我想它会在外部抓取它们,因为模糊大小会到达纹理边界之外,有没有办法防止纹理查找发生在我正在处理的纹理之外 frag: precision mediump float; uniform sampl

我正在尝试创建一个模糊的着色器,我已经做到了。然而,有一个问题。纹理周围有一个黑色背景,当着色器运行时,它会从该背景中获取颜色,并最终使整个图像变暗(但它仍然会很好地模糊图像,就好像它也在降低亮度一样)。为了确定这就是我所想的,我将背景设置为白色,这确实使我的图像更加暗淡。我真的不知道如何防止这种情况,我想它会在外部抓取它们,因为模糊大小会到达纹理边界之外,有没有办法防止纹理查找发生在我正在处理的纹理之外

frag:

precision mediump float;

uniform sampler2D CC_Texture0;  
uniform float u_time;

const lowp int SAMPLES = 9;
varying vec2 v_texCoord;        
varying highp vec2 transCord[SAMPLES];

void main()
{
      vec4 sum = vec4(0.0);

    sum += texture2D(CC_Texture0, transCord[0]) * 0.05;
    sum += texture2D(CC_Texture0, transCord[1]) * 0.09;
    sum += texture2D(CC_Texture0, transCord[2]) * 0.12;
    sum += texture2D(CC_Texture0, transCord[3]) * 0.15;
    sum += texture2D(CC_Texture0, transCord[4]) * 0.16;
    sum += texture2D(CC_Texture0, transCord[5]) * 0.15;
    sum += texture2D(CC_Texture0, transCord[6]) * 0.12;
    sum += texture2D(CC_Texture0, transCord[7]) * 0.09;
    sum += texture2D(CC_Texture0, transCord[8]) * 0.05;

      gl_FragColor = sum;
}
顶点着色器

precision mediump float;

attribute vec4 a_position;
attribute vec2 a_texCoord;

const lowp int SAMPLES = 9;

uniform highp float texelWidthOffset;
uniform highp float texelHeightOffset;
uniform highp float blurSize;
uniform float u_time;

varying vec2 v_texCoord;        
varying highp vec2 transCord[SAMPLES];

void main()
{
      gl_Position = CC_MVPMatrix * a_position;
    v_texCoord = a_texCoord;    
    highp vec2 offset = vec2(texelWidthOffset, texelHeightOffset) * (u_time * blurSize);

    transCord[0] = a_texCoord - offset * 4.0;
    transCord[1] = a_texCoord - offset * 3.0;
    transCord[2] = a_texCoord - offset * 2.0;
    transCord[3] = a_texCoord - offset * 1.0;
    transCord[4] = a_texCoord;
    transCord[5] = a_texCoord + offset * 1.0;
    transCord[6] = a_texCoord + offset * 2.0;
    transCord[7] = a_texCoord + offset * 3.0;
    transCord[8] = a_texCoord + offset * 4.0;
}

更新:这似乎只是在CCRenderTexture上渲染时出现的问题。我不知道为什么。

在S和T中,将纹理的包裹模式设置为GL_CLAMP_to_EDGE——这将意味着超出范围的UV坐标值返回更合理的结果