OpenGL 2.0片段着色器不适用于Cocos2d-X

OpenGL 2.0片段着色器不适用于Cocos2d-X,opengl,opengl-es,cocos2d-x,marmalade,Opengl,Opengl Es,Cocos2d X,Marmalade,我正在使用Cocos2d-X2.2.3和Marmalade SDK 7.4开发一个游戏,我创建了一个片段着色器来降低我的一些精灵的饱和度,或者换言之,去除它们的所有颜色,并仅以灰色、黑色和白色的阴影显示它们 我写的着色器是这样的: #ifdef GL_ES precision mediump float; #endif varying vec2 v_texCoord; uniform sampler2D u_texture; void main() { float grayScale

我正在使用Cocos2d-X2.2.3和Marmalade SDK 7.4开发一个游戏,我创建了一个片段着色器来降低我的一些精灵的饱和度,或者换言之,去除它们的所有颜色,并仅以灰色、黑色和白色的阴影显示它们

我写的着色器是这样的:

#ifdef GL_ES
precision mediump float;
#endif

varying vec2 v_texCoord;
uniform sampler2D u_texture;

void main()
{
    float grayScaleValue;
    vec3 originalColor;

    originalColor = texture2D(u_texture, v_texCoord).rgb;

    grayScaleValue = 0.21 * originalColor.r + 0.72 * originalColor.g + 0.07 * originalColor.b;

    gl_FragColor = vec4(grayScaleValue, grayScaleValue, grayScaleValue, 1);
}
我使用算法计算页面中的灰度值

我用于加载此着色器的代码如下所示:

// Please note that the class: GameObjectSprite is a subclass of CCSprite.
void GameObjectSprite::initShaders()
{
    const GLchar *shaderSource = (const GLchar*) CCString::createWithContentsOfFile("shaders/Grayscale.fsh")->getCString();

    shader = new CCGLProgram();
    shader->initWithVertexShaderByteArray(ccPositionTextureA8Color_vert, shaderSource);
    shader->addAttribute(kCCAttributeNamePosition, kCCVertexAttribFlag_Position);
    shader->addAttribute(kCCAttributeNameColor, kCCVertexAttribFlag_TexCoords);

    CHECK_GL_ERROR_DEBUG();
    shader->link();

    shader->updateUniforms();
    CHECK_GL_ERROR_DEBUG();

    this->setShaderProgram(shader);
    this->getShaderProgram()->use();
}

不幸的是,我的着色器不工作,精灵显示正常颜色,就好像我没有对其着色器进行任何更改一样。

我设法解决了这个问题。我认为正如@glampert所说,我没有正确加载MVP矩阵。这是我的新代码:

void GameLayer::loadShaders()
{
    CCGLProgram *shader;
    const GLchar *fragmentShader;

    shader = new CCGLProgram();

    fragmentShader = CCString::stringWithContentsOfFile("Grayscale.fsh")->getCString();

    shader->initWithVertexShaderByteArray(ccPositionTextureA8Color_vert, fragmentShader);
    shader->addAttribute(kCCAttributeNamePosition, kCCVertexAttrib_Position);
    shader->addAttribute(kCCAttributeNameTexCoord, kCCVertexAttrib_TexCoords);

    CHECK_GL_ERROR_DEBUG();
    shader->link();

    shader->updateUniforms();
    CHECK_GL_ERROR_DEBUG();

    sprite->setShaderProgram(shader);
    sprite->getShaderProgram()->use();
}
请注意,我将下面几行的值从:

shader->addAttribute(kCCAttributeNamePosition, kCCVertexAttribFlag_Position);
shader->addAttribute(kCCAttributeNameColor, kCCVertexAttribFlag_TexCoords);
致:


此外,我不再使用“精灵批处理”节点来绘制精灵。

绘制精灵时也必须应用着色器。在绘图代码的某个地方,您需要有一个GetShaderProgramm->use;。嗨,实际上我认为问题在于我使用了一个精灵批处理节点来渲染我的精灵。我相信批处理节点会覆盖每个精灵的draw调用,这就是为什么什么都没有发生。但是我仍然有一个问题,现在我实际使用我的着色器,我的所有精灵都消失了。我修改了我的代码,所以它只有:gl_FragColor=texture2Du_texture,v_texCoord;就像一个普通的着色器,但我的精灵仍然丢失。注意:我还添加了getShaderProgram->use;到绘制方法。这可能是顶点着色器的问题。你必须确保矩阵被正确设置,以便顶点被变换。我相信我使用的是标准的顶点着色器ccPositionTextureA8Color_vert。我用它将精灵的位置发送到着色器:shader->addAttributeKCAttributeNamePosition,KCCVertExAttributeFlag_position;。还有什么我应该做的吗?是的,这个位置可能乘以一个矩阵,这个矩阵是着色器的一个统一变量。您必须在绘图之前设置该变量。
shader->addAttribute(kCCAttributeNamePosition, kCCVertexAttrib_Position);
shader->addAttribute(kCCAttributeNameTexCoord, kCCVertexAttrib_TexCoords);