LoginSignup
8
7

More than 5 years have passed since last update.

Cocos2D-X 3.xでGLSLの使い方法

Posted at

新しいサンプルのプロジェクト

GameScene.cpp
bool GameLayer::init()
{
    ...
    // sourceSprite
    _sourceSprite = Sprite::create("HelloWorld.png");
    _sourceSprite->setPosition(Vec2(_screenWidth/2, _screenHeight/2));
    this->addChild(_sourceSprite);

    // apply gray effect to sprite
    this->greySprite(_sourceSprite);
}
GameScene.cpp
void GameLayer::graySprite(Sprite * sprite)
{
    if(sprite)
    {
        GLProgram * p = new GLProgram();
        p->initWithFilenames("gray.vsh", "gray.fsh");
        p->bindAttribLocation(GLProgram::ATTRIBUTE_NAME_POSITION, GLProgram::VERTEX_ATTRIB_POSITION);
        p->bindAttribLocation(GLProgram::ATTRIBUTE_NAME_COLOR, GLProgram::VERTEX_ATTRIB_COLOR);
        p->bindAttribLocation(GLProgram::ATTRIBUTE_NAME_TEX_COORD, GLProgram::VERTEX_ATTRIB_TEX_COORDS);
        p->link();
        p->updateUniforms();
        sprite->setGLProgram(p);
    }
}

Resourcesのファイルに gray.vshgray.fsh を入れます

gray.vsh
varying vec4 v_fragmentColor;   
varying vec2 v_texCoord;    

void main()         
{
    vec4 v_orColor = v_fragmentColor * texture2D(CC_Texture0, v_texCoord);
    float gray = dot(v_orColor.rgb, vec3(0.299, 0.587, 0.114));
    gl_FragColor = vec4(gray, gray, gray, v_orColor.a);
}               

gray.fsh
attribute vec4 a_position;
attribute vec2 a_texCoord;
attribute vec4 a_color;


varying vec4 v_fragmentColor;
varying vec2 v_texCoord;

void main() 
{                           
    gl_Position = CC_PMatrix * a_position;  // not CC_MVPMatrix
    v_fragmentColor = a_color;
    v_texCoord = a_texCoord;
}
8
7
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
7