上文中提到,在SvrEye脚本中OnPreRender方法中执行了SwapBuffer切换Buffer的操作。在SvrEye中默认的buffer数量为3,
指的是在程序运行过程中,保存前后两帧图像的左右预备的buffer,之后没帧渲染时会切换前后的帧图像,通过这种方式可以有效的防止VR画面的延迟。
完成切换Buffer的操作后,SDK中需要对Buffer的图像进行赋值,这部分逻辑在OnPostRender方法中,该方法调用了RecreateBufferIsDirty方法,根据eType类型为保存了图像指针类型的数组TextureId进行赋值。
全部的OnPostRender方法的代码如下:
void OnPostRender()
{
RecreateBuffersIfDirty();
if (OnPostRenderListener != null)
{
OnPostRenderListener();
}
}
void RecreateBuffersIfDirty()
{
if (dirty)
{
if (recreateBuffersCoroutine != null)
{
StopCoroutine(recreateBuffersCoroutine);
recreateBuffersCoroutine = null;
}
recreateBuffersCoroutine = StartCoroutine(RecreateBuffersDeferred());
dirty = false;
}
}
IEnumerator RecreateBuffersDeferred()
{
int i = 0;
while (i < bufferCount)
{
int index = currentTextureIndex - 1;
index = index >= 0 ? index : bufferCount - 1;
if (eyeTextures[index] != null)
eyeTextures[index].Release();
switch (imageType)
{
case eType.RenderTexture:
eyeTextures[index] = new RenderTexture((int)(resolution.x * resolutionScaleFactor), (int)(resolution.y * resolutionScaleFactor), depth, format);
eyeTextures[index].antiAliasing = antiAliasing;
eyeTextures[index].Create();
eyeTextureIds[index] = eyeTextures[index].GetNativeTexturePtr().ToInt32();
Debug.Log("Re-create Render Texture with ID: " + eyeTextureIds[index] + " Width: " + eyeTextures[index].width + " Height: " + eyeTextures[index].height + " AA: " + eyeTextures[index].antiAliasing);
break;
case eType.StandardTexture:
if (imageTexture) eyeTextureIds[index] = imageTexture.GetNativeTexturePtr().ToInt32();
break;
case eType.EglTexture:
eyeTextureIds[index] = 0;
break;
}
int prevTextureIndex = currentTextureIndex;
yield return new WaitUntil(() => currentTextureIndex != prevTextureIndex);
i++;
}
yield break;
}