UIImageview 图片变灰色

之前ccsprite加载一张图片 可以用shader将图片变成灰色,
为什么同样的函数用在Imageview上 完全没有效果

附变灰函数:
do
{
const GLchar* pszFragSource =
#ifdef GL_ES \n
precision mediump float; \n
#endif \n
uniform sampler2D u_texture; \n
varying vec2 v_texCoord; \n
varying vec4 v_fragmentColor; \n
void main(void) \n
{ \n
// Convert to greyscale using NTSC weightings \n
vec4 col = texture2D(u_texture, v_texCoord); \n
float grey = dot(col.rgb, vec3(0.299, 0.587, 0.114)); \n
gl_FragColor = vec4(grey, grey, grey, col.a); \n
}”;
CCGLProgram* pProgram = new CCGLProgram();
pProgram->initWithVertexShaderByteArray(ccPositionTextureColor_vert, pszFragSource);
sp->setShaderProgram(pProgram);
CHECK_GL_ERROR_DEBUG();

    sp->getShaderProgram()->addAttribute(kCCAttributeNamePosition, kCCVertexAttrib_Position);  
    sp->getShaderProgram()->addAttribute(kCCAttributeNameColor, kCCVertexAttrib_Color);  
    sp->getShaderProgram()->addAttribute(kCCAttributeNameTexCoord, kCCVertexAttrib_TexCoords);  
    CHECK_GL_ERROR_DEBUG();  

    sp->getShaderProgram()->link();  
    CHECK_GL_ERROR_DEBUG();  

    sp->getShaderProgram()->updateUniforms();  
    CHECK_GL_ERROR_DEBUG();  
} while (0);

自己顶一下

ImageView是一个Node,你需要对ImageView的virtualRenderer应用这个shader,可以使用imageViwe->getVirtualRenderer获取ImageView内部的图片,然后再应用此shader.

变灰色了,真感谢啊。

诶 为什么我设置图片变灰,效果是实现了,但是图片会产生一个位移,请问是什么原因呢?我是给cocostudio的一个节点的图片设置的shader,设置后节点的position没变,但是图片位置改变了。

检查下图片的坐标是否有变化,然后看下你的shader程序是否有错误。

我的是用lua写的 精灵是可以变灰的,但是imageview 用getVirtualRenderer()返回的来使用shader 但是不会变灰啊 是怎么回事啊

我用lua写的灰化,对精灵有用,但是imageview没用。看到你回答了一个网友的。我也是了用getVirtualRenderer这个。但是还是没有变灰。想请教你一下。

function ui.setGreyShader(node)
    local program = cc.GLProgramCache:getInstance():getGLProgram("shader_grey")
    if (program == nil) then
        program = cc.GLProgram:create("res/Shaders/shader_grey.vsh", "res/Shaders/shader_grey.fsh")
        program:bindAttribLocation(cc.ATTRIBUTE_NAME_POSITION, cc.VERTEX_ATTRIB_POSITION) 
        program:bindAttribLocation(cc.ATTRIBUTE_NAME_TEX_COORD, cc.VERTEX_ATTRIB_TEX_COORD)
        program:bindAttribLocation(cc.ATTRIBUTE_NAME_COLOR, cc.VERTEX_ATTRIB_COLOR)
        program:link()
        program:updateUniforms()
        cc.GLProgramCache:getInstance():addGLProgram(program, "shader_grey");
    end
    node:setGLProgram(program);
end

引擎版本?

我用的3.4版本的,sprite可以灰化,imageview也是没有效果。。

ImageView -> getVirtualRenderer获取的是一个Scale9Sprite,直接对Scale9Sprite设置shader是没有效果的,因为Scale9Sprite继承至Node.

所以正确的做法应该是ImageView->getVirtualRenderer->getSprite()-> setGLProgram.

如果使用3.4,应该可以直接调用Scale9Sprite的setState(State::GRAY),不需要自己再写shader了。

嗯,按你说的这样可以了,非常感谢。