标签:gevent 技术 渲染 xtu 内容 asi 核心 bag games
Unity Vision VR/AR Summit来到中国了(http://www.bagevent.com/event/197605?bag_track=http://www.bagevent.com/event/197605 ),最近也关注了一下Unity的VR开发。
相关链接:
- 官方帖子:http://steamcommunity.com/games/250820/announcements/detail/604985915045842668
- GitHub下载:https://github.com/ValveSoftware/the_lab_renderer
- Unity Asset Store下载:https://www.assetstore.unity3d.com/en/#!/content/63141
从GitHub下载了The Lab Renderer之后,粗略的浏览一遍,内容不多,主要是几个组件的C#代码和一些Shader。接下来就看看它的主要特性是怎么实现的。
The Lab Renderer使用Forward Rendering的原因主要是为了MSAA(MultiSampling Anti-Aliasing)和效率。然而Unity默认的Forward Rendering使用了Multi-Pass来渲染所有灯光(每个物体的每个动态灯要多一个Pass来渲染它的光照),The Lab Renderer提供了一个单Pass渲染多个灯光的解决方案。
#define MAX_LIGHTS 18
...
float4 g_vLightColor[ MAX_LIGHTS ];
float4 g_vLightPosition_flInvRadius[ MAX_LIGHTS ];
float4 g_vLightDirection[ MAX_LIGHTS ];
然后使用一个for循环,一次性计算所有灯光的光照:
LightingTerms_t ComputeLighting( float3 vPositionWs ...)
{
[ loop ] for ( int i = 0; i < g_nNumLights; i++ )
{}
}
接下来就是在C#层来处理灯光信息了。
然后,需要在Main Camera对象上添加“ValveCamera.cs”脚本。在class ValveCamera.UpdateLightConstants()成员函数中,会计算所有的灯光相关的参数,并设置到Shader的常量中。
以上就是The Lab Renderer的Single-Pass Forward Rendering这个特性的实现思路。
The Lab Renderer还接管了阴影的渲染。需要在Unity的Quality->Shadows settings 中选择“Disable Shadows”来关闭Unity默认的阴影。
上述算法的流程控制,在ValveCamera.cs脚本中实现。首先它需要一个从灯光角度渲染的Camera、一个RenderTexture用做Shadow Map,还需要一个Shader来进行Shadow Map渲染(Resources/vr_cast_shadows.shader)。
[ExecuteInEditMode]
[RequireComponent( typeof( Camera ) )]
public class ValveCamera : MonoBehaviour
{
...
[NonSerialized] private Camera m_shadowCamera = null;
[NonSerialized] public RenderTexture m_shadowDepthTexture = null;
[NonSerialized] public Shader m_shaderCastShadows = null;
...
}
在ValueCamera.OnPreCull()脚本回调函数中会调用ValueCamera.ValveShadowBufferRender()来渲染Shadow Buffer。如上图的Shadow所示,The Lab把所有灯光渲染到了一个整体的Shadow Buffer之中,把每个灯光Shadow Buffer对应的区域,存储到Shader参数“g_vShadowMinMaxUv”之中。这样在前面讲的Single-Pass Forward Rendering过程中,就可以在一个Pass实现所有灯光的光影计算了。
至于vr_cast_shadows.shader的内容,就很简单了,它核心就是一个Vertex Shader,用来计算Projection之后的Position坐标就好,UV啊什么之类的都可以省略掉了。
在灯光渲染的Shader中(vr_lighting.cginc)通过ComputeShadow_PCF_3x3_Gaussian()函数来计算阴影。所谓的PCF就是Percentage Closer Filter,为的是产生阴影的边缘柔滑效果。在这个函数中,它才算有了高斯过滤来对目标点周围的3x3范围进行计算。
对于VR来说,帧速率是非常重要的,所以Valve的大牛就添加了这个特性:动态调节渲染质量,达到稳定的搞效率,这是他在GDC 2016上的一个演讲:https://www.youtube.com/watch?v=eIlb688pUu4
这部分主要涉及到何时去调节质量,调节哪些地方(哪些是不能随便调的),具体的逻辑都在ValveCamera.UpdateAdaptiveQuality()这个函数里了。
标签:gevent 技术 渲染 xtu 内容 asi 核心 bag games
原文地址:http://blog.csdn.net/neil3d/article/details/52807902