2017-04-03 9 views
0

N個のテクスチャをカスタムシェーダに渡したいとします。私がネットを使ってサーフィンしているので、私が持っている最良の選択肢は、スプライト:: draw()関数をオーバーライドして、ドロープールにCustomCommandオブジェクトを追加することです。追加のNテクスチャをcocos2dのカスタムシェーダに渡します

CPPファイル:

void SpriteSub::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags) { 

    m_cmdCustom.init(_globalZOrder, transform, flags); 
    m_cmdCustom.func = CC_CALLBACK_0(SpriteSub::onDraw, this, transform, flags); 
    renderer->addCommand(&m_cmdCustom); 

    Sprite::draw(renderer, transform, flags); 

} 

void SpriteSub::onDraw(const Mat4 &transform, uint32_t /*flags*/) { 

    this->getGLProgram()->use(); 

    auto wwProgram = m_shader->getProgram(); 

    auto texBall0 = Director::getInstance()->getTextureCache()->addImage("ball.png")->getName(); 
    GLuint locTexIcon0 = glGetUniformLocation(wwProgram, "texBall0"); 
    glUniform1i(locTexIcon0, 0); 
    //glActiveTexture(GL_TEXTURE0 + 0); glBindTexture(GL_TEXTURE_2D, texBall0); 
    //glActiveTexture(GL_TEXTURE0 + 0); 
    GL::bindTexture2D(texBall0); 

} 

framentシェーダ:

#ifdef GL_ES 
    precision lowp float; 
    #endif 

    varying vec4 v_fragmentColor; 
    varying vec2 v_texCoord; 

    uniform sampler2D texBall0; 
    uniform sampler2D texBall1; 
    //uniform sampler2D texBall2; 
    //uniform sampler2D texBall3; 
    //uniform sampler2D texBall4; 
    //uniform sampler2D texBall5; 

    void main() 
    { 

     float t = 0.7f; 

     //gl_FragColor = texture2D(CC_Texture0, v_texCoord); 

     //this is just a sample code 
     gl_FragColor = texture2D(texBall0, v_texCoord) * t; 
     gl_FragColor += texture2D(texBall1, v_texCoord) * (t-1); 

     //some code that uses the other textures... 

    } 

シェーダは、上記のサンプルだけではなく私が使用している実際のコードです。今のところ、ピクセルを処理するために複数のテクスチャを1つのシェーダに正常に渡すだけで済みます。

現在、渡されたテクスチャは表示できません。これを達成するために何をすべきか? Splrite :: draw()は、SpriteSub :: draw()でonDraw()からglコマンドを取り消しますか?

答えて

0

'解決済み!

描画を無効にするか、レンダーキューにCustomCommandを追加する必要はありません。

ステップ:

1)あなたのカスタムシェーダを使用して作成GLProgramオブジェクトにGLProgramStateを作成します。

2.)GLProgramState::setUniformTexture("uniformVarName", tex2D)を使用して、一意の変数を探し、テクスチャ名を渡します。

3.)sprite->setGLProgram(program)の代わりにsprite->setGLProgramState(programState)を呼び出します。

CCPファイル:

m_shader = GLProgram::createWithByteArrays(ccPositionTextureColor_noMVP_vert, shader_frag); 
m_shader->retain(); 

auto shaderState = GLProgramState::getOrCreateWithGLProgram(m_shader); 

auto textureCache = Director::getInstance()->getTextureCache(); 
auto img0 = textureCache->addImage("icon_tex0.png")->getName(); 
auto img1 = textureCache->addImage("icon_tex1.png")->getName(); 
auto img2 = textureCache->addImage("icon_tex2.png")->getName(); 
auto img3 = textureCache->addImage("icon_tex3.png")->getName(); 
auto img4 = textureCache->addImage("icon_tex4.png")->getName(); 
auto img5 = textureCache->addImage("icon_tex5.png")->getName(); 

shaderState->setUniformTexture("texIcon0", img0); 
shaderState->setUniformTexture("texIcon1", img1); 
shaderState->setUniformTexture("texIcon2", img2); 
shaderState->setUniformTexture("texIcon3", img3); 
shaderState->setUniformTexture("texIcon4", img4); 
shaderState->setUniformTexture("texIcon5", img5); 

//this->setGLProgram(m_shader); 
this->setGLProgramState(shaderState); 

フラグメントシェーダ:

#ifdef GL_ES 
    precision lowp float; 
    #endif 

    varying vec4 v_fragmentColor; 
    varying vec2 v_texCoord; 

    uniform sampler2D texIcon0; 
    uniform sampler2D texIcon1; 
    uniform sampler2D texIcon2; 
    uniform sampler2D texIcon3; 
    uniform sampler2D texIcon4; 
    uniform sampler2D texIcon5; 

    void main() 
    { 

     int numTex = 6; 
     float fWeight = 1.0f/float(length); 

     //gl_FragColor = texture2D(CC_Texture0, v_texCoord); 
     gl_FragColor += texture2D(texIcon0, v_texCoord) * fWeight; 
     gl_FragColor += texture2D(texIcon1, v_texCoord) * fWeight; 
     gl_FragColor += texture2D(texIcon2, v_texCoord) * fWeight; 
     gl_FragColor += texture2D(texIcon3, v_texCoord) * fWeight; 
     gl_FragColor += texture2D(texIcon4, v_texCoord) * fWeight; 
     gl_FragColor += texture2D(texIcon5, v_texCoord) * fWeight; 


    } 

源:

関連する問題