void BattleLowNode::onDraw(const cocos2d::Mat4 &transform, uint32_t flags) { auto glProgram = _programState->getGLProgram(); glProgram->use(); // auto loc = glProgram->getUniformLocation("u_color"); // glProgram->setUniformLocationWith4fv(loc, &_color.r, 1); // loc = glProgram->getUniformLocation("u_factor"); // glProgram->setUniformLocationWith1f(loc, _factor); // loc = glProgram->getUniformLocation("u_texture_shadow"); // glProgram->setUniformLocationWith1i(loc, 1); // loc = glProgram->getUniformLocation("u_light_color"); // glProgram->setUniformLocationWith3fv(loc, &_lightColor.r, 1); // loc = glProgram->getUniformLocation("u_light_direction"); // glProgram->setUniformLocationWith3fv(loc, &_lightDirection.x, 1); // loc = glProgram->getUniformLocation("u_speed"); // glProgram->setUniformLocationWith1f(loc, _speed*25); // GL::bindTexture2DN(1, _textureShadow->getName()); auto loc = glProgram->getUniformLocation("u_texture_fieldbg"); glProgram->setUniformLocationWith1i(loc, 0); GL::bindTexture2DN(0, _textureFieldBg->getName()); loc = glProgram->getUniformLocation("u_texture_buildingbg"); glProgram->setUniformLocationWith1i(loc, 1); GL::bindTexture2DN(1, _textureBuildingBg->getName()); glProgram->setUniformsForBuiltins(transform); glBindBuffer(GL_ARRAY_BUFFER, _vbo); if (Configuration::getInstance()->supportsShareableVAO()) { GL::bindVAO(_vao); } else { // TODO } glEnable (GL_BLEND); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); /*2D的,都在同一Z位置,开启depth test会导致后画的不再绘制。 glEnable(GL_DEPTH_TEST); glDepthMask(true); */ glDrawArrays(GL_TRIANGLES, 0, 6); if (Configuration::getInstance()->supportsShareableVAO()) { GL::bindVAO(0); } glBindBuffer(GL_ARRAY_BUFFER, 0); CC_INCREMENT_GL_DRAWN_BATCHES_AND_VERTICES(1,6); CHECK_GL_ERROR_DEBUG(); }
void GLProgram::updateUniforms() { _builtInUniforms[UNIFORM_AMBIENT_COLOR] = glGetUniformLocation(_program, UNIFORM_NAME_AMBIENT_COLOR); _builtInUniforms[UNIFORM_M_MATRIX] = glGetUniformLocation(_program, UNIFORM_NAME_M_MATRIX); _builtInUniforms[UNIFORM_V_MATRIX] = glGetUniformLocation(_program, UNIFORM_NAME_V_MATRIX); _builtInUniforms[UNIFORM_P_MATRIX] = glGetUniformLocation(_program, UNIFORM_NAME_P_MATRIX); _builtInUniforms[UNIFORM_MV_MATRIX] = glGetUniformLocation(_program, UNIFORM_NAME_MV_MATRIX); _builtInUniforms[UNIFORM_VP_MATRIX] = glGetUniformLocation(_program, UNIFORM_NAME_VP_MATRIX); _builtInUniforms[UNIFORM_MVP_MATRIX] = glGetUniformLocation(_program, UNIFORM_NAME_MVP_MATRIX); _builtInUniforms[UNIFORM_NORMAL_MATRIX] = glGetUniformLocation(_program, UNIFORM_NAME_NORMAL_MATRIX); _builtInUniforms[UNIFORM_TIME] = glGetUniformLocation(_program, UNIFORM_NAME_TIME); _builtInUniforms[UNIFORM_SIN_TIME] = glGetUniformLocation(_program, UNIFORM_NAME_SIN_TIME); _builtInUniforms[UNIFORM_COS_TIME] = glGetUniformLocation(_program, UNIFORM_NAME_COS_TIME); _builtInUniforms[UNIFORM_RANDOM01] = glGetUniformLocation(_program, UNIFORM_NAME_RANDOM01); _builtInUniforms[UNIFORM_SAMPLER0] = glGetUniformLocation(_program, UNIFORM_NAME_SAMPLER0); _builtInUniforms[UNIFORM_SAMPLER1] = glGetUniformLocation(_program, UNIFORM_NAME_SAMPLER1); _builtInUniforms[UNIFORM_SAMPLER2] = glGetUniformLocation(_program, UNIFORM_NAME_SAMPLER2); _builtInUniforms[UNIFORM_SAMPLER3] = glGetUniformLocation(_program, UNIFORM_NAME_SAMPLER3); _builtInUniforms[UNIFORM_EYE_POSITION] = glGetUniformLocation(_program, UNIFORM_NAME_EYE_POSITION); _flags.usesM = _builtInUniforms[UNIFORM_M_MATRIX] != -1; _flags.usesV = _builtInUniforms[UNIFORM_V_MATRIX] != -1; _flags.usesP = _builtInUniforms[UNIFORM_P_MATRIX] != -1; _flags.usesMV = _builtInUniforms[UNIFORM_MV_MATRIX] != -1; _flags.usesVP = _builtInUniforms[UNIFORM_VP_MATRIX] != -1; _flags.usesMVP = _builtInUniforms[UNIFORM_MVP_MATRIX] != -1; _flags.usesNormal = _builtInUniforms[UNIFORM_NORMAL_MATRIX] != -1; _flags.usesTime = ( _builtInUniforms[UNIFORM_TIME] != -1 || _builtInUniforms[UNIFORM_SIN_TIME] != -1 || _builtInUniforms[UNIFORM_COS_TIME] != -1 ); _flags.usesRandom = _builtInUniforms[UNIFORM_RANDOM01] != -1; _flags.usesEyePosition = _builtInUniforms[UNIFORM_EYE_POSITION] != -1; this->use(); // Since sample most probably won't change, set it to 0,1,2,3 now. if(_builtInUniforms[UNIFORM_SAMPLER0] != -1) setUniformLocationWith1i(_builtInUniforms[UNIFORM_SAMPLER0], 0); if(_builtInUniforms[UNIFORM_SAMPLER1] != -1) setUniformLocationWith1i(_builtInUniforms[UNIFORM_SAMPLER1], 1); if(_builtInUniforms[UNIFORM_SAMPLER2] != -1) setUniformLocationWith1i(_builtInUniforms[UNIFORM_SAMPLER2], 2); if(_builtInUniforms[UNIFORM_SAMPLER3] != -1) setUniformLocationWith1i(_builtInUniforms[UNIFORM_SAMPLER3], 3); }
void GLProgram::updateUniforms() { _builtInUniforms[UNIFORM_AMBIENT_COLOR] = glGetUniformLocation(_program, UNIFORM_NAME_AMBIENT_COLOR); _builtInUniforms[UNIFORM_P_MATRIX] = glGetUniformLocation(_program, UNIFORM_NAME_P_MATRIX); _builtInUniforms[UNIFORM_MULTIVIEW_P_MATRIX] = glGetUniformLocation(_program, UNIFORM_NAME_MULTIVIEW_P_MATRIX); _builtInUniforms[UNIFORM_MV_MATRIX] = glGetUniformLocation(_program, UNIFORM_NAME_MV_MATRIX); _builtInUniforms[UNIFORM_MVP_MATRIX] = glGetUniformLocation(_program, UNIFORM_NAME_MVP_MATRIX); _builtInUniforms[UNIFORM_MULTIVIEW_MVP_MATRIX] = glGetUniformLocation(_program, UNIFORM_NAME_MULTIVIEW_MVP_MATRIX); _builtInUniforms[UNIFORM_NORMAL_MATRIX] = glGetUniformLocation(_program, UNIFORM_NAME_NORMAL_MATRIX); _builtInUniforms[UNIFORM_TIME] = glGetUniformLocation(_program, UNIFORM_NAME_TIME); _builtInUniforms[UNIFORM_SIN_TIME] = glGetUniformLocation(_program, UNIFORM_NAME_SIN_TIME); _builtInUniforms[UNIFORM_COS_TIME] = glGetUniformLocation(_program, UNIFORM_NAME_COS_TIME); _builtInUniforms[UNIFORM_RANDOM01] = glGetUniformLocation(_program, UNIFORM_NAME_RANDOM01); _builtInUniforms[UNIFORM_SAMPLER0] = glGetUniformLocation(_program, UNIFORM_NAME_SAMPLER0); _builtInUniforms[UNIFORM_SAMPLER1] = glGetUniformLocation(_program, UNIFORM_NAME_SAMPLER1); _builtInUniforms[UNIFORM_SAMPLER2] = glGetUniformLocation(_program, UNIFORM_NAME_SAMPLER2); _builtInUniforms[UNIFORM_SAMPLER3] = glGetUniformLocation(_program, UNIFORM_NAME_SAMPLER3); _flags.usesP = _builtInUniforms[UNIFORM_P_MATRIX] != -1; _flags.usesMultiViewP = _builtInUniforms[UNIFORM_MULTIVIEW_P_MATRIX] != -1; _flags.usesMV = _builtInUniforms[UNIFORM_MV_MATRIX] != -1; _flags.usesMVP = _builtInUniforms[UNIFORM_MVP_MATRIX] != -1; _flags.usesMultiViewMVP = _builtInUniforms[UNIFORM_MULTIVIEW_MVP_MATRIX] != -1; _flags.usesNormal = _builtInUniforms[UNIFORM_NORMAL_MATRIX] != -1; _flags.usesTime = ( _builtInUniforms[UNIFORM_TIME] != -1 || _builtInUniforms[UNIFORM_SIN_TIME] != -1 || _builtInUniforms[UNIFORM_COS_TIME] != -1 ); _flags.usesRandom = _builtInUniforms[UNIFORM_RANDOM01] != -1; this->use(); // Since sample most probably won't change, set it to 0,1,2,3 now. if(_builtInUniforms[UNIFORM_SAMPLER0] != -1) setUniformLocationWith1i(_builtInUniforms[UNIFORM_SAMPLER0], 0); if(_builtInUniforms[UNIFORM_SAMPLER1] != -1) setUniformLocationWith1i(_builtInUniforms[UNIFORM_SAMPLER1], 1); if(_builtInUniforms[UNIFORM_SAMPLER2] != -1) setUniformLocationWith1i(_builtInUniforms[UNIFORM_SAMPLER2], 2); if(_builtInUniforms[UNIFORM_SAMPLER3] != -1) setUniformLocationWith1i(_builtInUniforms[UNIFORM_SAMPLER3], 3); // clear any glErrors created by any not found uniforms glGetError(); }
void RoadNode::onDraw(const Mat4 &transform, uint32_t flags) { auto glProgram = _roadProgram; glProgram->use(); Color4F color = _roadColor; color.a = color.a *_opacity /255.f; auto loc = glProgram->getUniformLocation("u_color"); glProgram->setUniformLocationWith4fv(loc, &color.r, 1); loc = glProgram->getUniformLocation("u_texture"); glProgram->setUniformLocationWith1i(loc, 0); GL::bindTexture2DN(0, _roadTexture->getName()); glProgram->setUniformsForBuiltins(transform); GL::blendFunc(_roadBlendFunc.src, _roadBlendFunc.dst); if (_dirty) { glBindBuffer(GL_ARRAY_BUFFER, _vbo); glBufferData(GL_ARRAY_BUFFER, sizeof(V3F_C4B_T2F)*_bufferCapacity, _buffer, GL_STREAM_DRAW); _dirty = false; } if (Configuration::getInstance()->supportsShareableVAO()) { GL::bindVAO(_vao); } else { GL::enableVertexAttribs(GL::VERTEX_ATTRIB_FLAG_POS_COLOR_TEX); glBindBuffer(GL_ARRAY_BUFFER, _vbo); // vertex glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 3, GL_FLOAT, GL_FALSE, sizeof(V3F_C4B_T2F), (GLvoid *)offsetof(V3F_C4B_T2F, vertices)); // color glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(V3F_C4B_T2F), (GLvoid *)offsetof(V3F_C4B_T2F, colors)); // texcood glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_TEX_COORD, 2, GL_FLOAT, GL_FALSE, sizeof(V3F_C4B_T2F), (GLvoid *)offsetof(V3F_C4B_T2F, texCoords)); } glDrawArrays(GL_TRIANGLES, 0, _bufferCount); glBindBuffer(GL_ARRAY_BUFFER, 0); if (Configuration::getInstance()->supportsShareableVAO()) { GL::bindVAO(0); } CC_INCREMENT_GL_DRAWN_BATCHES_AND_VERTICES(1, _bufferCount); CHECK_GL_ERROR_DEBUG(); }
void ShadowCover::onDraw(const cocos2d::Mat4 &transform, uint32_t flags) { auto glProgram = _programState->getGLProgram(); glProgram->use(); // auto loc = glProgram->getUniformLocation("u_color"); // glProgram->setUniformLocationWith4fv(loc, &_color.r, 1); // loc = glProgram->getUniformLocation("u_factor"); // glProgram->setUniformLocationWith1f(loc, _factor); // loc = glProgram->getUniformLocation("u_texture_shadow"); // glProgram->setUniformLocationWith1i(loc, 1); // loc = glProgram->getUniformLocation("u_light_color"); // glProgram->setUniformLocationWith3fv(loc, &_lightColor.r, 1); // loc = glProgram->getUniformLocation("u_light_direction"); // glProgram->setUniformLocationWith3fv(loc, &_lightDirection.x, 1); // loc = glProgram->getUniformLocation("u_speed"); // glProgram->setUniformLocationWith1f(loc, _speed*25); // GL::bindTexture2DN(1, _textureShadow->getName()); auto loc = glProgram->getUniformLocation("u_texture_shadow"); glProgram->setUniformLocationWith1i(loc, 0); GL::bindTexture2DN(0, _textureShadow->getName()); /* loc = glProgram->getUniformLocation("u_texture_building_normalmap"); glProgram->setUniformLocationWith1i(loc, 1); GL::bindTexture2DN(1, _textureBuildingNormalMap->getName()); loc = glProgram->getUniformLocation("u_texture_be_attacked"); glProgram->setUniformLocationWith1i(loc, 2); GL::bindTexture2DN(2, _textureBeAttacked->getName()); loc = glProgram->getUniformLocation("u_texture_be_cured"); glProgram->setUniformLocationWith1i(loc, 3); GL::bindTexture2DN(3, _textureBeCured->getName()); loc = glProgram->getUniformLocation("u_para_ambient_color"); glProgram->setUniformLocationWith4fv(loc, &_paraAmbientColor.x, 1); loc = glProgram->getUniformLocation("u_para_attacked_cured"); glProgram->setUniformLocationWith4fv(loc, &_paraAttackedCured.x, 1); loc = glProgram->getUniformLocation("u_lights"); glProgram->setUniformLocationWith4fv(loc, &_lights[0].x, DDConfig::NUM_LIGHT); loc = glProgram->getUniformLocation("u_lights_color"); glProgram->setUniformLocationWith4fv(loc, &_lightsColor[0].x, DDConfig::NUM_LIGHT); loc = glProgram->getUniformLocation("u_building_animation_index"); glProgram->setUniformLocationWith1i(loc, _buildingAnimationIndex); */ glProgram->setUniformsForBuiltins(transform); glBindBuffer(GL_ARRAY_BUFFER, _vbo); if (_dirty) { _dirty = false; glBufferData(GL_ARRAY_BUFFER, sizeof(ShadowCoverVertexFormat)*DDConfig::BATTLE_NUM*DDConfig::BATTLE_NUM*6, _vertexData, GL_STREAM_DRAW); } if (Configuration::getInstance()->supportsShareableVAO()) { GL::bindVAO(_vao); } else { // TODO } glEnable (GL_BLEND); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // shadow cover打开depth test同时在fsh中对a为0的进行discard,以保证重合交叠处不会交叠而加深。 glEnable(GL_DEPTH_TEST); glDepthMask(true); glDrawArrays(GL_TRIANGLES, 0, DDConfig::BATTLE_NUM*DDConfig::BATTLE_NUM*6); if (Configuration::getInstance()->supportsShareableVAO()) { GL::bindVAO(0); } glBindBuffer(GL_ARRAY_BUFFER, 0); glDisable(GL_DEPTH_TEST); glDepthMask(false); CC_INCREMENT_GL_DRAWN_BATCHES_AND_VERTICES(1,DDConfig::BATTLE_NUM*DDConfig::BATTLE_NUM*6); CHECK_GL_ERROR_DEBUG(); }
void BattleHighNode::onDraw(const cocos2d::Mat4 &transform, uint32_t flags) { auto glProgram = _programState->getGLProgram(); glProgram->use(); // auto loc = glProgram->getUniformLocation("u_color"); // glProgram->setUniformLocationWith4fv(loc, &_color.r, 1); // loc = glProgram->getUniformLocation("u_factor"); // glProgram->setUniformLocationWith1f(loc, _factor); // loc = glProgram->getUniformLocation("u_texture_shadow"); // glProgram->setUniformLocationWith1i(loc, 1); // loc = glProgram->getUniformLocation("u_light_color"); // glProgram->setUniformLocationWith3fv(loc, &_lightColor.r, 1); // loc = glProgram->getUniformLocation("u_light_direction"); // glProgram->setUniformLocationWith3fv(loc, &_lightDirection.x, 1); // loc = glProgram->getUniformLocation("u_speed"); // glProgram->setUniformLocationWith1f(loc, _speed*25); // GL::bindTexture2DN(1, _textureShadow->getName()); auto loc = glProgram->getUniformLocation("u_texture_building_animation"); glProgram->setUniformLocationWith1i(loc, 0); GL::bindTexture2DN(0, _textureBuildingAnimation->getName()); loc = glProgram->getUniformLocation("u_texture_building_normalmap"); glProgram->setUniformLocationWith1i(loc, 1); GL::bindTexture2DN(1, _textureBuildingNormalMap->getName()); loc = glProgram->getUniformLocation("u_texture_be_attacked"); glProgram->setUniformLocationWith1i(loc, 2); GL::bindTexture2DN(2, _textureBeAttacked->getName()); loc = glProgram->getUniformLocation("u_texture_be_cured"); glProgram->setUniformLocationWith1i(loc, 3); GL::bindTexture2DN(3, _textureBeCured->getName()); loc = glProgram->getUniformLocation("u_para_ambient_color"); glProgram->setUniformLocationWith4fv(loc, &_paraAmbientColor.x, 1); loc = glProgram->getUniformLocation("u_para_attacked_cured"); glProgram->setUniformLocationWith4fv(loc, &_paraAttackedCured.x, 1); loc = glProgram->getUniformLocation("u_lights"); glProgram->setUniformLocationWith4fv(loc, &_lights[0].x, DDConfig::NUM_LIGHT); loc = glProgram->getUniformLocation("u_lights_color"); glProgram->setUniformLocationWith4fv(loc, &_lightsColor[0].x, DDConfig::NUM_LIGHT); loc = glProgram->getUniformLocation("u_building_animation_index"); glProgram->setUniformLocationWith1i(loc, _buildingAnimationIndex); glProgram->setUniformsForBuiltins(transform); glBindBuffer(GL_ARRAY_BUFFER, _vbo); if (Configuration::getInstance()->supportsShareableVAO()) { GL::bindVAO(_vao); } else { // TODO } glEnable (GL_BLEND); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); /*2D的,都在同一Z位置,开启depth test会导致后画的不再绘制。 glEnable(GL_DEPTH_TEST); glDepthMask(true); */ glDrawArrays(GL_TRIANGLES, 0, 6); if (Configuration::getInstance()->supportsShareableVAO()) { GL::bindVAO(0); } glBindBuffer(GL_ARRAY_BUFFER, 0); CC_INCREMENT_GL_DRAWN_BATCHES_AND_VERTICES(1,6); CHECK_GL_ERROR_DEBUG(); }