【问题标题】:OpenGL 2.0 fragment shader not working with Cocos2d-XOpenGL 2.0 片段着色器不适用于 Cocos2d-X
【发布时间】:2014-09-16 00:52:44
【问题描述】:

我正在使用 Cocos2d-X 2.2.3 和 Marmalade SDK 7.4 开发一个游戏,我创建了一个片段着色器来降低我的一些精灵的饱和度,或者换句话说,从它们中移除所有颜色并仅以阴影显示它们灰色(黑白)。

我写的shader是这个:

#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);
}

我采用算法从this页面计算灰度值。

我用来加载这个着色器的代码如下:

// 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();
}

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

【问题讨论】:

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

标签: opengl opengl-es cocos2d-x marmalade


【解决方案1】:

我设法解决了。我认为正如@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);

收件人:

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

另外,我不再使用精灵批处理节点来绘制我的精灵。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多