您的位置:首页 > 移动开发 > Unity3D

Unity场景渲染相关实现的猜想

2016-01-17 22:59 603 查看
  如下,很简单的一个场景,一个Panel,二个Cube,一个camera,一个方向光,其中为了避免灯光阴影的影响,关掉阴影,而Panel和二个Cube都是默认的材质,没做修改,我原猜,这三个模型应该都动态合并成一个,但是根据Unity的Frame Debug的显示,我们可以看下,只有同模型的地合并了。然后把模型A向前移动到Z小于0,神奇的看到,同模型的二个cube也不能动态合并了。

  

void RenderDeviceGLES::SetRenderTarget(RenderTarget* rt)
{
n_assert (rt)

const RenderTargetGLES* pRTGLES = _Convert<RenderTarget, RenderTargetGLES>(rt);

GLbitfield mask = 0;

const GLESFrameBuf& fbo = pRTGLES->GetRenderTargetGLES();

if (!pRTGLES->IsDefaultRenderTarget())
{
_UnbindBuffer();

m_glesImpl->ActiveFrameBuffer(fbo.FrameBuf);
}
else
{
m_glesImpl->ActiveFrameBuffer(m_mainFBOnum);

mask |= GL_DEPTH_BUFFER_BIT;
mask |= GL_STENCIL_BUFFER_BIT;
}

uint clearFlags = pRTGLES->GetClearFlags();

if (clearFlags & RenderTarget::ClearColor)
{
mask |= GL_COLOR_BUFFER_BIT;
}

if (pRTGLES->HasDepthStencilBuffer())
{
if (clearFlags & RenderTarget::ClearDepth)
{
mask |= GL_DEPTH_BUFFER_BIT;
}

if (clearFlags & RenderTarget::ClearStencil)
{
mask |= GL_STENCIL_BUFFER_BIT;
}
}

if (mask != 0)
{
const Math::float4& color = pRTGLES->GetClearColor();
glClearColor(color.x(), color.y(), color.z(), color.w());
m_glesImpl->CheckError();
GLboolean bDepthMask = GL_FALSE;

glGetBooleanv(GL_DEPTH_WRITEMASK, &bDepthMask);
glDepthMask(GL_TRUE);
m_glesImpl->CheckError();
glClear(mask);
m_glesImpl->CheckError();
glDepthMask(bDepthMask);
m_glesImpl->CheckError();
}
}


SetRenderTarget
  如上Ogre中的PassQuad差不多也是一样。

  如上所有结论都只是针对Genesis3D里的实现,至于和Unity有多少和这些相似就不保证了,不过上面Genesis3D的渲染流程确实可以解释最上面图片里的现象,有知道Unity3D内部实现的同学欢迎指正。

  在2015定下的目标,C++11实践,Ogre,用Ogre实现某东东,虽然实现的都不是很完善,但是惊喜的是Ogre2.1的出来,并理解其中大部分内容,学习最新引擎的实现相关优化。而在这一年,主要在新公司学习Unity以及VR,理解Unity与VR的原理。哈哈,非常看好VR,感觉未来的方向就是这个,如果2016年尾有时间,学习下相应UE4的源码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: