void RawStencilBufferTest::onBeforeDrawSprite(int planeIndex, const Vec2& pt) { this->setupStencilForDrawingOnPlane(planeIndex); CHECK_GL_ERROR_DEBUG(); Vec2 vertices[] = { Vec2::ZERO, Vec2(pt.x, 0), pt, Vec2(0, pt.y) }; auto glProgram = GLProgramCache::getInstance()->getGLProgram(GLProgram::SHADER_NAME_POSITION_U_COLOR); int colorLocation = glProgram->getUniformLocation("u_color"); CHECK_GL_ERROR_DEBUG(); Color4F color = _planeColor[planeIndex]; glProgram->use(); glProgram->setUniformsForBuiltins(); glProgram->setUniformLocationWith4fv(colorLocation, (GLfloat*) &color.r, 1); GL::enableVertexAttribs( GL::VERTEX_ATTRIB_FLAG_POSITION ); glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, vertices); glDrawArrays(GL_TRIANGLE_FAN, 0, 4); CC_INCREMENT_GL_DRAWN_BATCHES_AND_VERTICES(1, 4); }
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 RawStencilBufferTest6::setupStencilForClippingOnPlane(GLint plane) { GLint planeMask = 0x1 << plane; glStencilMask(planeMask); glStencilFunc(GL_NEVER, 0, planeMask); glStencilOp(GL_REPLACE, GL_KEEP, GL_KEEP); Vec2 pt = Director::getInstance()->getWinSize(); Vec2 vertices[] = { Vec2::ZERO, Vec2(pt.x, 0), pt, Vec2(0, pt.y) }; auto glProgram = GLProgramCache::getInstance()->getGLProgram(GLProgram::SHADER_NAME_POSITION_U_COLOR); int colorLocation = glProgram->getUniformLocation("u_color"); CHECK_GL_ERROR_DEBUG(); Color4F color(1, 1, 1, 1); glProgram->use(); glProgram->setUniformsForBuiltins(); glProgram->setUniformLocationWith4fv(colorLocation, (GLfloat*) &color.r, 1); GL::enableVertexAttribs( GL::VERTEX_ATTRIB_FLAG_POSITION ); glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, vertices); glDrawArrays(GL_TRIANGLE_FAN, 0, 4); CC_INCREMENT_GL_DRAWN_BATCHES_AND_VERTICES(1, 4); glStencilFunc(GL_NEVER, planeMask, planeMask); glStencilOp(GL_REPLACE, GL_KEEP, GL_KEEP); glDisable(GL_DEPTH_TEST); glDepthMask(GL_FALSE); #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) || (CC_TARGET_PLATFORM == CC_PLATFORM_LINUX) || (CC_TARGET_PLATFORM == CC_PLATFORM_MAC) glEnable(GL_ALPHA_TEST); glAlphaFunc(GL_GREATER, _alphaThreshold); #else auto program = GLProgramCache::getInstance()->getGLProgram(GLProgram::SHADER_NAME_POSITION_TEXTURE_ALPHA_TEST_NO_MV); GLint alphaValueLocation = glGetUniformLocation(program->getProgram(), GLProgram::UNIFORM_NAME_ALPHA_TEST_VALUE); program->use(); program->setUniformLocationWith1f(alphaValueLocation, _alphaThreshold); #endif glFlush(); }
void RoadNode::onDrawGLLine(const cocos2d::Mat4 &transform, uint32_t flags) { auto glProgram = _lineProgram; glProgram->use(); Color4F color = _lineColor; color.a = color.a *_opacity /255.f; auto loc = glProgram->getUniformLocation("u_color"); glProgram->setUniformLocationWith4fv(loc, &color.r, 1); glProgram->setUniformsForBuiltins(transform); if (_dirtyGLLine) { glBindBuffer(GL_ARRAY_BUFFER, _vboGLLine); glBufferData(GL_ARRAY_BUFFER, sizeof(V3F_T2F)*_bufferCapacityGLLine, _bufferGLLine, GL_STREAM_DRAW); _dirtyGLLine = false; } if (Configuration::getInstance()->supportsShareableVAO()) { GL::bindVAO(_vaoGLLine); } else { glBindBuffer(GL_ARRAY_BUFFER, _vboGLLine); GL::enableVertexAttribs(GL::VERTEX_ATTRIB_FLAG_POS_COLOR_TEX); // vertex glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 3, GL_FLOAT, GL_FALSE, sizeof(V3F_T2F), (GLvoid *)offsetof(V3F_T2F, vertices)); // texcood glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_TEX_COORD, 2, GL_FLOAT, GL_FALSE, sizeof(V3F_T2F), (GLvoid *)offsetof(V3F_T2F, texCoords)); } glEnable (GL_BLEND); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glLineWidth(_lineWidth); glEnable(GL_DEPTH_TEST); glDepthMask(true); glDrawArrays(GL_LINES, 0, _bufferCountGLLine); if (Configuration::getInstance()->supportsShareableVAO()) { GL::bindVAO(0); } glBindBuffer(GL_ARRAY_BUFFER, 0); CC_INCREMENT_GL_DRAWN_BATCHES_AND_VERTICES(1,_bufferCountGLLine); CHECK_GL_ERROR_DEBUG(); }
void AcceEffectSpace::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_time"); glProgram->setUniformLocationWith1f(loc, _time); loc = glProgram->getUniformLocation("u_percent"); glProgram->setUniformLocationWith1f(loc, _percent); loc = glProgram->getUniformLocation("u_length"); glProgram->setUniformLocationWith1f(loc, _length); glProgram->setUniformsForBuiltins(transform); if (Configuration::getInstance()->supportsShareableVAO()) { GL::bindVAO(_vao); } else { // TODO // glBindBuffer(GL_ARRAY_BUFFER, _vboGLLine); // GL::enableVertexAttribs(GL::VERTEX_ATTRIB_FLAG_POS_COLOR_TEX); // // vertex // glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 3, GL_FLOAT, GL_FALSE, sizeof(V3F_T2F), (GLvoid *)offsetof(V3F_T2F, vertices)); // // texcood // glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_TEX_COORD, 2, GL_FLOAT, GL_FALSE, sizeof(V3F_T2F), (GLvoid *)offsetof(V3F_T2F, texCoords)); } glEnable (GL_BLEND); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); glDepthMask(true); glDrawArrays(GL_TRIANGLES, 0, _count); if (Configuration::getInstance()->supportsShareableVAO()) { GL::bindVAO(0); } glBindBuffer(GL_ARRAY_BUFFER, 0); CC_INCREMENT_GL_DRAWN_BATCHES_AND_VERTICES(1,_count); CHECK_GL_ERROR_DEBUG(); }
void StencilStateManager::drawFullScreenQuadClearStencil() { Director* director = Director::getInstance(); CCASSERT(nullptr != director, "Director is null when setting matrix stack"); director->pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW); director->loadIdentityMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW); director->pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION); director->loadIdentityMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION); Vec2 vertices[] = { Vec2(-1.0f, -1.0f), Vec2(1.0f, -1.0f), Vec2(1.0f, 1.0f), Vec2(-1.0f, 1.0f) }; auto glProgram = GLProgramCache::getInstance()->getGLProgram(GLProgram::SHADER_NAME_POSITION_U_COLOR); int colorLocation = glProgram->getUniformLocation("u_color"); CHECK_GL_ERROR_DEBUG(); Color4F color(1, 1, 1, 1); glProgram->use(); glProgram->setUniformsForBuiltins(); glProgram->setUniformLocationWith4fv(colorLocation, (GLfloat*) &color.r, 1); glBindBuffer(GL_ARRAY_BUFFER, 0); GL::enableVertexAttribs( GL::VERTEX_ATTRIB_FLAG_POSITION ); glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, vertices); glDrawArrays(GL_TRIANGLE_FAN, 0, 4); CC_INCREMENT_GL_DRAWN_BATCHES_AND_VERTICES(1, 4); director->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION); director->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW); }
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"); glProgram->setUniformLocationWith1i(loc, 0); GL::bindTexture2DN(0, _textureBuildingTexture->getName()); loc = glProgram->getUniformLocation("u_texture_be_attacked"); glProgram->setUniformLocationWith1i(loc, 1); GL::bindTexture2DN(1, _textureBeAttacked->getName()); loc = glProgram->getUniformLocation("u_texture_be_cured"); glProgram->setUniformLocationWith1i(loc, 2); GL::bindTexture2DN(2, _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(); }
void PixelNode::onDraw(const cocos2d::Mat4 &transform, uint32_t flags) { auto glProgram = _programState->getGLProgram(); glProgram->use(); auto loc = glProgram->getUniformLocation("u_cbf_opacity"); glProgram->setUniformLocationWith1f(loc, _opacityAsAlpha ? getOpacity()/255.f : 1.f); loc = glProgram->getUniformLocation("u_posexpand"); glProgram->setUniformLocationWith1f(loc, _opacityAsPosExpand ? _posexpand*(1.f - getOpacity()/255.f) : 0.f); loc = glProgram->getUniformLocation("u_mixcolor"); glProgram->setUniformLocationWith4fv(loc, &(_mixColor.x), 1); loc = glProgram->getUniformLocation("u_y_cut"); glProgram->setUniformLocationWith1f(loc, _yCut); glProgram->setUniformsForBuiltins(transform); glBindBuffer(GL_ARRAY_BUFFER, _vbo); if (Configuration::getInstance()->supportsShareableVAO()) { GL::bindVAO(_vao); } else { // TODO } if (_blend) { glEnable (GL_BLEND); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); } else { glDisable(GL_BLEND); } glEnable(GL_CULL_FACE); // shadow cover打开depth test同时在fsh中对a为0的进行discard,以保证重合交叠处不会交叠而加深。 glEnable(GL_DEPTH_TEST); glDepthMask(true); if (_stencil) { glEnable(GL_STENCIL_TEST); // Draw floor glStencilFunc(GL_ALWAYS, 1, 0xFF); // Set any stencil to 1 glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); glStencilMask(0xFF); // Write to stencil buffer glDepthMask(GL_FALSE); // Don't write to depth buffer glClear(GL_STENCIL_BUFFER_BIT); // Clear stencil buffer (0 by default) } if (_stenciled) { glEnable(GL_STENCIL_TEST); glStencilFunc(GL_EQUAL, 1, 0xFF); // Pass test if stencil value is 1 glStencilMask(0x00); // Don't write anything to stencil buffer glDepthMask(GL_TRUE); // Write to depth buffer } glDrawArrays(GL_TRIANGLES, 0, _count); if (Configuration::getInstance()->supportsShareableVAO()) { GL::bindVAO(0); } glDisable(GL_STENCIL_TEST); glBindBuffer(GL_ARRAY_BUFFER, 0); glDisable(GL_DEPTH_TEST); glDepthMask(false); glEnable (GL_BLEND); CC_INCREMENT_GL_DRAWN_BATCHES_AND_VERTICES(1,_count); CHECK_GL_ERROR_DEBUG(); }