Ich möchte N Textur an einen benutzerdefinierten Shader übergeben. Während ich durch das Netz surfte, ist die beste Option, die ich habe, die Sprite :: draw() - Funktion zu überschreiben und ein CustomCommand-Objekt zum Draw-Pool hinzuzufügen.Übergeben Sie zusätzliche N Texturen an einen benutzerdefinierten Shader in cocos2d
CPP-Datei:
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 Shader:
#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...
}
Der Shader oben ist nur ein Beispiel und nicht der eigentliche Code ich verwende. Im Moment muss ich nur mehrere Texturen in einem Shader erfolgreich verarbeiten, um ihre Pixel zu verarbeiten.
Derzeit kann ich die übergebene Textur nicht anzeigen. Was sollte getan werden, um dies zu erreichen? Setzt Sprite :: draw() in SpriteSub :: draw() die gl-Befehle von onDraw() aus?