因为需要用到3D图层,启用Depth_test和Alpha_test。在CCDirector中有找到setDepthTest的接口,但是没有setAlphaTest的接口。
于是只能调用GL的接口实现。代码如下:
(引擎使用的cocos2d-x-3.3beta0)
void Level::onEnter()
{
Director::getInstance()->setDepthTest(true);
glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0.1f);
Layer::onEnter();
}
void Level::onExit()
{
Layer::onExit();
Director::getInstance()->setDepthTest(false);
glDisable(GL_ALPHA_TEST);
}
在windows上是没有问题的,效果如下:
但是编译android版时出错,找不到 GL_ALPHA_TEST。
看了下代码,发现GL_ALPHA_TEST是定义在
external\win32-specific\gles\include\OGLES\GL\glew.h
编译android是找不到的。
后面搜了下那几个demo的代码,发现有这样的:
#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
看起来启用GL_ALPHA_TEST用下面那段代码代替了。我试了,虽然可以编过,但是在手机上依然无效。
不过这里感觉很奇怪,glew本身是跨平台的,为何编译android用不了?
另外Director::getInstance()->setDepthTest(true);这句话也有问题。
在手机上第一次打开游戏是OK的,但是按home键退出再回到游戏后,Depth_test就失效了。
不知道有没有哪位大侠遇到过这个问题?求解救/_\
另附上场景搭建的代码:
auto marisa = Sprite::create("textures/marisa.png");
marisa->setAnchorPoint(Vec2(0.5, 0));
marisa->setPosition3D(Vec3(origin.x - 100, origin.y - 200, 0));
this->addChild(marisa, 0);
auto mare = Sprite::create("textures/mare.png");
mare->setAnchorPoint(Vec2(0.5, 0));
mare->setPosition3D(Vec3(origin.x + 200, origin.y - 200, -1000));
this->addChild(mare, 0);
auto ground = Sprite::create("textures/ground.png");
ground->setPosition3D(Vec3(origin.x, origin.y - 200, 0));
ground->setRotation3D(Vec3(-90, 0, 0));
this->addChild(ground, 0);
// Set camera
setCameraMask((unsigned short)CameraFlag::USER1);
auto camera = Camera::createPerspective(60, visibleSize.width / visibleSize.height, 1, 5000);
camera->setCameraFlag(CameraFlag::USER1);
camera->lookAt(Vec3(0, 0, 0), Vec3(0, 1, 0));
camera->setPosition3D(Vec3(0, 0, 500));
addChild(camera);
