主要用于不同阵营的单位,有颜色的差别,不是修改全局色相,就是修改某个值的颜色,请问cocos里面有修改像素的相应接口吗?
没有,这个需要你自己写shader
应该可以获取某个图片的二进制数据,然后遍历进行修改与混合数据,可以吧?使用uint8array重新渲染。可以吗?不写shader
shader最适合处理这种方式,获取数据然后修改混合数据首先内存增加,需要保存修改后的数据,
Sprite* label1 = (Sprite*)p1;
Sprite* label2 = (Sprite*)p2;
auto n1GLProgram = label1->getGLProgram();
auto n2GLProgramState = label2->getGLProgramState();
const char* vshader = R"(
attribute vec4 a_position;
attribute vec2 a_texCoord;
attribute vec4 a_color;
#ifdef GL_ES
varying lowp vec4 v_fragmentColor;
varying mediump vec2 v_texCoord;
#else
varying vec4 v_fragmentColor;
varying vec2 v_texCoord;
#endif
void main()
{
gl_Position = CC_PMatrix * a_position;
v_fragmentColor = a_color;
v_texCoord = a_texCoord;
} )";
const char* changefs = R"(
#ifdef GL_ES
precision lowp float;
#endif
varying vec4 v_fragmentColor;
varying vec2 v_texCoord;
uniform vec3 u_mask;
void main()
{
vec4 texColor = texture2D(CC_Texture0, v_texCoord);
texColor.rgb = vec3(texColor.r * u_mask.r , texColor.g * u_mask.g , texColor.b * u_mask.b);
gl_FragColor = texColor;
}
)";
const char* notredfs = R"(
#ifdef GL_ES
precision lowp float;
#endif
varying vec2 v_texCoord;
void main()
{
vec4 texColor = texture2D(CC_Texture0, v_texCoord);
texColor.r = 0;
gl_FragColor = texColor;
}
)";
p3 = n1GLProgram;
p4 = n2GLProgramState;
auto program1 = GLProgram::createWithByteArrays(vshader, notredfs);
auto program2 = GLProgram::createWithByteArrays(vshader, changefs);
auto program2State = GLProgramState::getOrCreateWithGLProgram(program2);
program2State->setUniformVec3("u_mask", Vec3(0.5f,0.3f,0.8f));
label1->setGLProgram(program1);
label2->setGLProgramState(program2State);
实际效果如何