Sprite3D皮肤变灰实现

PS(我说发帖没人理我呢,发错板块了之前,发到了cocos里面)

Image* skin = new Image();
skin->initWithImageFile(“monguger.tga”);

    unsigned char *pData = skin->getData(); 
    int iIndex = 0; 
    for (int i = 0; i < skin->getHeight(); i++) 
    { 
        for (int j = 0; j < skin->getWidth(); j++) 
        { 
            int iBPos = iIndex; 
            unsigned int iB = pData; 
            iIndex++; 
            unsigned int iG = pData; 
            iIndex++; 
            unsigned int iR = pData; 
            iIndex++; 
            iIndex++; 
            unsigned int iGray = 0.3 * iR + 0.6 * iG + 0.1 * iB; 
            pData = pData = pData = (unsigned char)iGray; 
        } 
    } 

    Texture2D *tex = new Texture2D(); 
    tex->initWithImage(skin); 

    monster->setTexture(tex);//monster是你创建的Sprite3D模型 

最后求比较好看的RGB颜色的算法。。。。。。。。。。
最后求比较好看的RGB颜色的算法。。。。。。。。。。
最后求比较好看的RGB颜色的算法。。。。。。。。。。
最后求比较好看的RGB颜色的算法。。。。。。。。。。

用两个纹理的alpha融合就可以了,第一个为彩色纹理,第二个为灰度纹理,缓慢的从第一个纹理过渡到第二个纹理就可以了。

莪有木有实例啊。。。可否给我看下啊。。我是新手

变灰用shader也很简单, 让CPU歇会。写个Material,再分几个technique,随时切换效果也方便
vertex shader:

attribute vec4 a_position;
attribute vec2 a_texCoord;

#ifdef GL_ES
varying mediump vec2 v_texCoord;
#else
varying vec2 v_texCoord;
#endif

void main()
{
    gl_Position = CC_MVPMatrix * a_position;
    v_texCoord = a_texCoord;
}


```


fragment shader:
#ifdef GL_ES
varying mediump vec2 v_texCoord;
#else
varying vec2 v_texCoord;
#endif

void main()
{
    vec4 color = texture2D(CC_Texture0, v_texCoord);
    float h = 0.3 * color.x + 0.6 * color.y + 0.1 * color.z;//变灰
    gl_FragColor = vec4(h, h, h, 1.0);
}


```

:14: :14: :14: