3D主动立体播放器开发

主动立体播放的原理很简单:产生左右眼画面,配合晶闸眼镜开闭左右眼,使左眼看到左眼画面,右眼看到右眼画面,通过人眼视觉差产生立体画面。
这里面有一个重要的技术兼容点:主动立体眼镜的同步信号与左右眼画面产生机制之间的匹配。这就需要显卡和显示设备(显示器或者投影仪等)厂家之间要协调兼容同步信号,可惜目前市场上的3D立体技术名目繁多,显卡厂商和显示设备厂商均推出自己的3D立体格式,导致市场混乱,限制了3D立体技术的发展。
在工程展示和3D仿真演示等领域通常需要使用多台显示设备进行融合播放、以及实时引擎渲染3D画面的需求,市面上的显卡和投影厂商配套的3D播放器均无法满足要求,需要开发自己的立体播放器。
开发3D立体播放器,最主要的技术问题是如何产生左右眼画面,且左右眼画面的序列与3D眼镜的左右眼画面切换频率完全一致,任何一帧画面的缺失均会导致左右眼反转,出现画面跳跃和立体画面反向问题。
为了避免左右画面序列的延迟缺失,理想的状态是由播放软件同时制作左右眼画面,输出给显卡或者显示设备,由显卡或者显示设备硬件根据时钟序列自主选择显示左右眼画面。
查阅相关资料,NVIDIA 3D Vision和Quad Buffered OpenGL技术可以支持这种理想模式,而支持3D的显示器和投影仪,不管3D菜单如何设置,均不会自主产生3D交错画面。
NVidia 3D Vision,按照资料介绍可以支持输入显卡左右眼画面,通过特殊标记,显卡可以自动产生左右眼序列帧。
在这里插入图片描述但经过实际测试,NV RTX 系列和NV Quadro RTX系列显卡无论在DirectX 9还是DirectX 10下均不支持这种3D播放模式。实际测试了一些3D播放器,其菜单中有NVIDIA 3D Vision选项,但实际选择并没有效果。而一些眼镜厂家会说显卡驱动需要安装418版本,且显示设备需要使用NVidia认证3D显示器。实际问题可能是NVIDIA已经取消了对3D Vision的支持,最新的QUADRO系列显卡也仅保留了3D SYNC信号接口,没有完整的3D Vision支持了。

https://3g.163.com/digi/article/EAECSP4S001680P9.html

Quad Buffered OpenGL,该技术利用OpenGL立体后备缓存来支持左右眼立体画面切换显示。
OpenGL提供了GL_LEFT_BACK、GL_RIGHT_BACK、GL_LEFT_FRONT和GL_RIGHT_FRONT四个缓冲区,内建了对立体显示的支持,但目前主流3D引擎对DirectX支持更好,而OpenGL的Quad Buffer也仅在高端型号才有提供。其应用前景并不是很好。
在这里插入图片描述
经测试,该播放技术在NVidia Quadro RTX 4000和RTX 8000显卡上可以使用。

硬件采集卡方案选择
排除以上显卡产生立体画面的方案,能选择的只能通过软件产生120Hz左右眼交错序列帧画面。软件实现方式也比较简单:1、打开显示垂直同步功能;2、保证软件产生120FPS的稳定帧率,每帧渲染后增加计数器,根据计数器奇偶选择显示左或右画面。

if (StereoSource_LeftRight == m_StereoSourceType) {
    
     // L-R
  if(0 == GetApplication()->m_nFrames % 2) {
    
    
    tutv = CFloatRect(tutv.left, tutv.top, tutv.right - tutv.Width()/2.0f, tutv.bottom);
  }
  else {
    
    
    tutv = CFloatRect(tutv.left + tutv.Width()/2.0f, tutv.top, tutv.right, tutv.bottom);
  }
}
else if (StereoSource_RightLeft == m_StereoSourceType) {
    
     // R-L
  if(1 == GetApplication()->m_nFrames % 2) {
    
    
    tutv = CFloatRect(tutv.left, tutv.top, tutv.right - tutv.Width()/2.0f, tutv.bottom);
  }
  else {
    
    
    tutv = CFloatRect(tutv.left + tutv.Width()/2.0f, tutv.top, tutv.right, tutv.bottom);
  }
}
else if (StereoSource_TopBottom == m_StereoSourceType) {
    
     // T-B
  if(0 == GetApplication()->m_nFrames % 2) {
    
    
    tutv = CFloatRect(tutv.left, tutv.top, tutv.right, tutv.bottom - tutv.Height()/2.0f);
  }
  else {
    
    
    tutv = CFloatRect(tutv.left, tutv.top + tutv.Height()/2.0f, tutv.right, tutv.bottom);
  }
}
else if (StereoSource_BottomTop == m_StereoSourceType) {
    
     // B-T
  if(1 == GetApplication()->m_nFrames % 2) {
    
    
    tutv = CFloatRect(tutv.left, tutv.top, tutv.right, tutv.bottom - tutv.Height()/2.0f);
  }
  else {
    
    
    tutv = CFloatRect(tutv.left, tutv.top + tutv.Height()/2.0f, tutv.right, tutv.bottom);
  }
}
Render(pSampleRender, GetClientRect(), tutv);
GetApplication()->m_nFrames=GetApplication()->m_nFrames+1;

如果不采用采集卡方案,需要3D渲染软件直接产生120FPS稳定帧率,对于复杂场景演示来说,很难达到要求。实际使用时,可以配置两台电脑,一台电脑同时渲染左右眼画面,另一台电脑通过采集卡采集左右画面,通过软件方式产生120FPS稳定的左右眼画面序列帧。

3D SYNC信号
3D SYNC信号是通知主动立体眼镜切换左右眼的一个信号,该信号与显卡的刷新率一致,配合软件产生的左右眼序列画面,实现3D立体播放。(这里我们不讲DLP Link技术,这是另一种光学切换3D画面的信号,与3D SYNC信号功能类似)
3D SYNC信号可以由两种设备产生:显卡或者显示设备(3D显示器和3D投影仪)。
3D SYNC显卡支持
由于NVIDIA已经取消对3D Vision支持,3D SYNC也已经在大部分显卡上取消了,仅在Quadro系列专业显卡上保留了一个3D SYNC引脚,需要配合一个3D SYNC子卡使用;在支持3D SYNC的显卡驱动中(需要安装特定版本),有一个3D显示支持的选项需要打开,对于有些显示设备,还需要选择匹配的3D格式等等,另外,显示器刷新率一定要设置为120Hz以上(120Hz刷新率并不是立体显示的强制要求,但是是NVIDIA 3D Vision的强制要求),否则即使设置正确,也不会输出3D SYNC信号,如果有多个显示器,只要有一个不是120Hz刷新率的也会不输出3D SYNC信号*(注意,实际工程环境中通常使用vnc类软件远程控制计算机,而有些vnc软件是通过虚拟显示设备实现远程桌面的,会导致显卡认为虚拟显示设备不是120Hz刷新率)*。总之,用NVidia Quadro + 3D SYNC子卡的方式产生3D同步信号有很多坑,需要一个个测试。
3D SYNC子卡
3D SYNC投影支持
在一些支持3D显示的投影机和显示器上,有一个3D SYNC输出接口,可以输出3D SYNC信号。支持3D的显示设备菜单里面通常有3D显示支持的开关,需要打开,而菜单中的3D制式和格式选项,通常没有什么作用。支持3D显示的投影机和显示器,输出3D SYNC信号时并不强制要求120Hz刷新率,通常仅需打开3D选项即可,这是比显卡产生3D SYNC灵活很多。

在这里插入图片描述3D SYNC信号接口是一个3针的类似PS鼠标的圆形接口,可以提供给配套的主动立体眼镜使用。通常,主动立体眼镜系统配有一个无线信号发射器,可以发射红外信号、无线射频信号、或者蓝牙信号等,用于眼镜左右眼切换同步信号。无线信号发射器自身不会产生左右眼交换信号,只是接收显卡或者3D显示设备的3D SYNC信号进行广播转发。

至此,总结一些,一个完整的3D立体显示系统需要以下技术支持:
1、一个产生3D SYNC信号的信号源,可以选择显卡,也可以选择支持3D SYNC接口的立体显示设备
2、一个广播3D SYNC信号的无线发射器,可以选择红外信号,也可以选择射频或者蓝牙等不易干扰的信号发射方式
3、配套无线信号发射器的主动立体眼镜,通常无线信号发射器和立体眼镜是配套一起销售的,信号发射和接收通常有一套自己的私有协议,并没有通用标准
4、一个产生左右交错画面序列的立体播放器

猜你喜欢

转载自blog.csdn.net/qq_31042143/article/details/108339162
今日推荐