自定义shader会影响其他精灵的绘制

各位好。
我自定义了一个shader,绘制Node后,会影响其他Sprite的绘制。请问怎么解决?
以下是详细说明。

shader定义:
vsh
attribute vec4 a_position;
attribute vec2 a_texCoord;
varying vec2 v_texCoord;
void main(void) {
gl_Position = a_position;
v_texCoord = a_texCoord;
}

fsh
varying vec2 v_texCoord;
uniform sampler2D tex_y;
uniform sampler2D tex_u;
uniform sampler2D tex_v;
void main(void) {
vec3 yuv;
vec3 rgb;
yuv.x = texture2D(tex_y, v_texCoord).r;
yuv.y = texture2D(tex_u, v_texCoord).r - 0.5;
yuv.z = texture2D(tex_v, v_texCoord).r - 0.5;
rgb = mat3(1, 1, 1,
0, -0.39465, 2.03211,
1.13983, -0.58060, 0) * yuv;
gl_FragColor = vec4(rgb, 1);
};

代码如下:
bool xxx::init()
{

_node = Node::create();
create_program(_node);

}

void xxx::create_program(cocos2d::Node * node)
{
_program = GLProgram::createWithByteArrays(vsh, fsh);
_state = GLProgramState::getOrCreateWithGLProgram(_program);
node->setGLProgramState(_state);

_state->setVertexAttribPointer("a_position", 2, GL_FLOAT, 0, 0, _vertex_vertices);
glEnableVertexAttribArray(_program->getAttribLocation("a_position"));

_state->setVertexAttribPointer("a_texCoord", 2, GL_FLOAT, 0, 0, _texture_vertices);
glEnableVertexAttribArray(_program->getAttribLocation("a_texCoord"));

_state->applyAttributes();

glGenTextures(1, &_id_y);
glBindTexture(GL_TEXTURE_2D, _id_y);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glGenTextures(1, &_id_u);
glBindTexture(GL_TEXTURE_2D, _id_u);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glGenTextures(1, &_id_v);
glBindTexture(GL_TEXTURE_2D, _id_v);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

}

void xxx::display()
{
GL::enableVertexAttribs(GL::VERTEX_ATTRIB_FLAG_POSITION | GL::VERTEX_ATTRIB_FLAG_TEX_COORD);

_program->use();

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, _id_y);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, _pixel_w, _pixel_h, 0, GL_RED, GL_UNSIGNED_BYTE, _plane[0]);
glUniform1i(_program->getUniformLocation("tex_y"), 0);

glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, _id_u);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, _pixel_w / 2, _pixel_h / 2, 0, GL_RED, GL_UNSIGNED_BYTE, _plane[1]);
glUniform1i(_program->getUniformLocation("tex_u"), 1);

glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D, _id_v);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, _pixel_w / 2, _pixel_h / 2, 0, GL_RED, GL_UNSIGNED_BYTE, _plane[2]);
glUniform1i(_program->getUniformLocation("tex_v"), 2);

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

}

代码解说:
1、本类是继承于Layer,内部保存一个Node,用来绘制背景。下划线的变量是对象的变量
2、create_program()创建shader,并且创建三个缓冲区。
3、重载visit,并绑定display函数。
4、在display中绘制。

当调用display后,可以正常显示yuv数据,但是其他层的Sprite也是用这个shader绘制的。
如图
[

]

我也遇到相同的问题,后来你解决了吗?