关于coco2d着色器的问题

我使用的是3.6版本,发现网上关于shader的教程不多,目前需要用到高亮和变灰的效果,然后从cpptest里面找到了.fsh的文件,然后按照例子的api自己写一个类,但是试了很久都没有效果,求高手指点哪里出错,谢了!
bool cGameButton::setEffect()
{
auto fileUtiles = cocos2d::FileUtils::getInstance();
auto fragmentFullPath = fileUtiles->fullPathForFilename(“shaders/grey.fsh”);
auto fragSource = fileUtiles->getStringFromFile(fragmentFullPath);
auto glprogram = cocos2d::GLProgram::createWithByteArrays(cocos2d::ccPositionTextureColor_noMVP_vert, fragSource.c_str());
glprogram->retain();

// set
m_pState = cocos2d::GLProgramState::getOrCreateWithGLProgram(glprogram);
m_pState->retain();

// cocos2d::Vec3 color(1.0f, 0.2f, 0.3f);
// GLfloat radius = 0.01f;
// GLfloat threshold = 1.75;
// m_pState->setUniformVec3(“u_outlineColor”, color);
// m_pState->setUniformFloat(“u_radius”, radius);
// m_pState->setUniformFloat(“u_threshold”, threshold);

// cocos2d::Size size = getTexture()->getContentSizeInPixels();
// m_pState->setUniformVec2(“resolution”, size);
// m_pState->setUniformFloat(“blurRadius”, 10);
// m_pState->setUniformFloat(“sampleNum”, 5);
//
setGLProgramState(m_pState);
glprogram->link();
glprogram->updateUniforms();

return true;

}

void cGameButton::draw(cocos2d::Renderer *renderer, const cocos2d::Mat4 &transform, uint32_t flags)
{
#if CC_USE_CULLING
// Don’t do calculate the culling if the transform was not updated
_insideBounds = (flags & FLAGS_TRANSFORM_DIRTY) ? renderer->checkVisibility(transform, _contentSize) : _insideBounds;

if(_insideBounds)

#endif
{
cocos2d::GLProgramState* tmpState = m_pState ? m_pState : getGLProgramState();
_quadCommand.init(_globalZOrder, _texture->getName(), tmpState, _blendFunc, &_quad, 1, transform, flags);
renderer->addCommand(&_quadCommand);
}

}

一个button是由三个状态组成,每个状态表现是一个显示Sprite,可以分别对所有状态的sprite设置shader

GLProgramState不需要retain,因为setGLProgramState已经retain了 。

glprogram->link();
glprogram->updateUniforms();
这两步也不需要,因为createWithByteArrays把这些都做了。

不需要重写draw,因为你set过了,所以get的时候glprogramstate是对的。

确认下你的shader,顶点shader用ccPositionTextureColor_noMVP_vert,片段shader用testcpp的example_GreyScale.fsh

完整代码只需要

void cGameButton::setEffect()
{
    auto fileUtiles = FileUtils::getInstance();
    auto fragmentFullPath = fileUtiles->fullPathForFilename("example_GreyScale.fsh");
    auto fragSource = fileUtiles->getStringFromFile(fragmentFullPath);
    auto glprogram = GLProgram::createWithByteArrays(ccPositionTextureColor_noMVP_vert, fragSource.c_str());
    
    auto glproramState = GLProgramState::getOrCreateWithGLProgram(glprogram);
    setGLProgramState(glproramState);
}
```

按照你的代码试了一次效果还是没有改变,shader用的是例子里面的

按我步骤操作

1.下载3.6包,解压。

2.拷贝cpp-tests/Resource/Shaders/example_greyScale.fsh到cpp-empty-test/Resources下

3.如果使用XCode,记得引入example_greyScale.fsh到资源目录下

3.在cpp-empty-test的HelloWorldScene.cpp的init函数return true前加入

    auto fileUtiles = FileUtils::getInstance();
    auto fragmentFullPath = fileUtiles->fullPathForFilename("example_greyScale.fsh");
    auto fragSource = fileUtiles->getStringFromFile(fragmentFullPath);
    auto glprogram = GLProgram::createWithByteArrays(ccPositionTextureColor_noMVP_vert, fragSource.c_str());
    
    auto glproramState = GLProgramState::getOrCreateWithGLProgram(glprogram);
    sprite->setGLProgramState(glproramState);

```


4.如果没啥反应,看下log输出。

我就不截图了。。。

ok,已经成功,是因为第三个步骤出错了,我没将文件引入到资源,所以createWithByteArrays 时控制台一直输出opengl error 0x0502
感谢版主