----问题:
新建cocos2dx3.10和3.13.1将setDesignResolutionSize(1366, 768, ResolutionPolicy::SHOW_ALL);并设置
glview = GLViewImpl::createWithRect("战斗吧原始人", Rect(0, 0, 960 , 640));
结果3.10的DEBUG_FPS位置在适配后的 0,0点,而3.13.1的DEBUG_FPS位置确在屏幕的0,0点,跟没适配时一样。
----原因:
两个版本的Scene::render()方法实现不同。
----解决:
将3.13.1的Scene::render()改为3.10版的。由于两个方法参数不同,之后要将所有涉及scene::render()的方法都改为只有render一个参数的。
--1.更改CCScene.cpp中render方法。
void Scene::render(Renderer* renderer)
{
auto director = Director::getInstance();
Camera* defaultCamera = nullptr;
const auto& transform = getNodeToParentTransform();
for (const auto& camera : getCameras())
{
if (!camera->isVisible())
continue;
Camera::_visitingCamera = camera;
if (Camera::_visitingCamera->getCameraFlag() == CameraFlag::DEFAULT)
{
defaultCamera = Camera::_visitingCamera;
}
director->pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION);
director->loadMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION, Camera::_visitingCamera->getViewProjectionMatrix());
camera->apply();
//clear background with max depth
camera->clearBackground();
//visit the scene
visit(renderer, transform, 0);
#if CC_USE_NAVMESH
if (_navMesh && _navMeshDebugCamera == camera)
{
_navMesh->debugDraw(renderer);
}
#endif
renderer->render();
director->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION);
}
#if CC_USE_3D_PHYSICS && CC_ENABLE_BULLET_INTEGRATION
if (_physics3DWorld && _physics3DWorld->isDebugDrawEnabled())
{
director->pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION);
director->loadMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION, _physics3dDebugCamera != nullptr ? _physics3dDebugCamera->getViewProjectionMatrix() : defaultCamera->getViewProjectionMatrix());
_physics3DWorld->debugDraw(renderer);
renderer->render();
director->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION);
}
#endif
Camera::_visitingCamera = nullptr;
experimental::FrameBuffer::applyDefaultFBO();
}
--2.CCScene.h中的render方法
// virtual void render(Renderer* renderer, const Mat4& eyeTransform, const Mat4* eyeProjection = nullptr);
virtual void render(Renderer* renderer);
--3.CCDirector.cpp中drawScene方法。
void Director::drawScene()
{
// calculate "global" dt
calculateDeltaTime();
if (_openGLView)
{
_openGLView->pollEvents();
}
//tick before glClear: issue #533
if (! _paused)
{
_eventDispatcher->dispatchEvent(_eventBeforeUpdate);
_scheduler->update(_deltaTime);
_eventDispatcher->dispatchEvent(_eventAfterUpdate);
}
_renderer->clear();
experimental::FrameBuffer::clearAllFBOs();
/* to avoid flickr, nextScene MUST be here: after tick and before draw.
* FIXME: Which bug is this one. It seems that it can't be reproduced with v0.9
*/
if (_nextScene)
{
setNextScene();
}
pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
if (_runningScene)
{
#if (CC_USE_PHYSICS || (CC_USE_3D_PHYSICS && CC_ENABLE_BULLET_INTEGRATION) || CC_USE_NAVMESH)
_runningScene->stepPhysicsAndNavigation(_deltaTime);
#endif
//clear draw stats
_renderer->clearDrawStats();
//render the scene
// _openGLView->renderScene(_runningScene, _renderer);
_runningScene->render(_renderer);
_eventDispatcher->dispatchEvent(_eventAfterVisit);
}
// draw the notifications node
if (_notificationNode)
{
_notificationNode->visit(_renderer, Mat4::IDENTITY, 0);
}
if (_displayStats)
{
showStats();
}
_renderer->render();
_eventDispatcher->dispatchEvent(_eventAfterDraw);
popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
_totalFrames++;
// swap buffers
if (_openGLView)
{
_openGLView->swapBuffers();
}
if (_displayStats)
{
calculateMPF();
}
}
--4.VRGenericRenderer.cpp中的render方法。
void VRGenericRenderer::render(Scene* scene, Renderer* renderer)
{
// FIXME: Use correct eye displacement
const float eyeOffset = 0.5;
auto headRotation = _headTracker->getLocalRotation();
Mat4 leftTransform;
Mat4::createTranslation(eyeOffset, 0, 0, &leftTransform);
leftTransform *= headRotation;
Mat4 rightTransform;
Mat4::createTranslation(-eyeOffset, 0, 0, &rightTransform);
rightTransform *= headRotation;
_fb->applyFBO();
auto defaultVP = Camera::getDefaultViewport();
Camera::setDefaultViewport(_leftEye.viewport);
// scene->render(renderer, leftTransform, nullptr);
scene->render(renderer);
Camera::setDefaultViewport(_rightEye.viewport);
// scene->render(renderer, rightTransform, nullptr);
scene->render(renderer);
Camera::setDefaultViewport(defaultVP);
_fb->restoreFBO();
auto texture = _fb->getRenderTarget()->getTexture();
GL::bindTexture2D(texture->getName());
_glProgramState->apply(Mat4::IDENTITY);
GLint origViewport[4];
glGetIntegerv(GL_VIEWPORT, origViewport);
glViewport(0, 0, _texSize.width, _texSize.height);
renderDistortionMesh(_leftDistortionMesh, texture->getName());
renderDistortionMesh(_rightDistortionMesh, texture->getName());
glViewport(origViewport[0], origViewport[1], origViewport[2], origViewport[3]);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
CHECK_GL_ERROR_DEBUG();
}
--5.CCGLVIew.cpp中的renderScene方法
void GLView::renderScene(Scene* scene, Renderer* renderer)
{
CCASSERT(scene, "Invalid Scene");
CCASSERT(renderer, "Invalid Renderer");
if (_vrImpl)
{
_vrImpl->render(scene, renderer);
}
else
{
// scene->render(renderer, Mat4::IDENTITY, nullptr);
scene->render(renderer);
}
}