1、立体可视化实现原理
Direct3D作为Microsoft开发的一套图形命令接口,其原理与OpenGL基本类似,包括矩阵、光照、纹理、图形管线等都可以参照OpenGL立体可视化插件的说明来理解。
Direct3D立体可视化的基本概念及重点步骤:
(1) Direct3D立体可视化的基本概念指的是在不影响原程序渲染顺序和结果的前提下,针对每一帧进行多次渲染来得到多视点图像,使用GPU将多视点图像进行逐像素交叉排列,并输出合成后的图像作为最终渲染结果。
(2) Direct3D的立体可视化与OpenGL的立体可视化存在一些差异,首先是准备阶段,Direct3D需要先截获Direct3D设备指针,通过重载的方式截获原程序调用的Direct3D API,并建立立体可视化需要的相关资源;同时,区别于OpenGL的是,Direct3D不需要拦截、记录、重现所有渲染函数,而是利用Direct3D的一些状态特点,只针对绘制函数进行特殊处理,通过多次不同的矩阵变换来得到多幅多视点图像。 Direct3D的矩阵变换: 原程序正常的顶点变换为P = p * Mworld * Mview * Mprojection 得到其他视点的视图,需要改变原有Mview 矩阵:
M’n(view) = Mview * Rn(angle) * Tn(x,z)
P’n = p * Mworld * M’n(view) * Mprojection 其中Rn(angle)为以Y轴为旋转轴的旋转矩阵,Tn(x,z)为(x,z)平面的平移矩阵。 示意图4如下:
图4:观察矩阵旋转平移示意图
(3) 基于多视图的立体可视化进行的多遍渲染将消耗大量时间,为了达到稳定流畅可交互的运行速度,可使用基于深度图的立体可视化技术。与前者不同的是后者将不关心Direct3D所调用的渲染函数及相关矩阵,而只需要得到每帧正常的渲染结果及深度信息图。如下图5:
图5:彩色图及深度图
(4) 经过矩阵变换和多次渲染后得到多幅多视点图像或者包含深度信息,并将其统一传送到GPU,使用Direct3D的HLSL着色语言(与OpenGL略有不同,但功能和效果基本相同)将其分离、交叉排列。交叉排列即将多视点图像按照立体图像成像规律(参见立体成像原理图)排列于一幅立体图,并最终输出显示。 2、支持和应用
Direct3D在windows平台下的强大优势,使得其应用范围空前巨大,应用在几乎所有3D需求领域,特别是在游戏领域占有重要优势。目前我们已经开发出SkyLine(地理信息类)、空战英雄(飞机类游戏)等。 |