计算机显卡的植入式真三维立体驱动方法

文档序号:6481523阅读:226来源:国知局
专利名称:计算机显卡的植入式真三维立体驱动方法
技术领域
本发明涉及三维可视化技术领域,具体涉及一种针对计算机显卡的植入式真三维立体驱 动方法。
背景技术
随着计算机技术的发展,真三维立体显示与观测已经成为环境仿真、模拟训练以及规 划设计等领域常用的技术手段,并逐步与电影电视、电脑游戏等结合产生立体电影电视和 真三维游戏而融入人们的日常生活。
立体视觉是因为人左眼及右眼所看到的相同物体有角度上的偏差,而在大脑形成视差, 从而形成真立体感。因此,在立体视觉中需要将左、右眼所看到的影像各自独立分开,然 后通过特定的外置设备使左右眼看到不同的影像而通过大脑的生理作用形成立体视觉。传 统的真三维立体显示需要专业的设备进行立体显示,包括支持左右缓存的显卡和支持双通 道显示的立体显示设备以及特别的编程环境与编程技术。基于上述技术产生了广为流行的 虚拟现实技术,在机器仿真、战场模拟等领域得到了广泛的应用。但是,由于需要专业设 备与编程技术成本高昂,限制了立体显示技术的应用,所以立体显示的应用不能得到推广, 大量的三维建模或可视化软件系统采用透视变换技术对场景进行处理,形成单目视觉的单 通道渲染图像,并进行显示输出,这种三维显示失去了三维程序应有的立体显示特性和沉 浸感。由于真三维立体显示需要专门硬件,特殊的编程环境与编程技术,大量的应用软件 在开发时没有考虑真三维立体显示特性,没有在程序中实现支持真三维立体显示的功能, 使得这些软件即使在有真三维立体显示功能的硬件上也不能支持真三维立体显示与观测, 这些软件占据了现有三维应用软件的绝大部分,包括商用CAD软件,三维建模软件,游戏 软件等等。

发明内容
本发明的目的在于克服现有三维应用软件在真三维立体显示与观测中存在的问题,对基 于主流3D API (显卡与应用程序之间的接口)的三维软件不加任何修改就能实现真三维立 体显示与观测。本发明的核心是利用三维渲染的基本原理,通过拦截显卡帧缓存中颜色和 深度数据,解析得到当前场景的投影变换矩阵以及单通道渲染的关键参数,应用三维渲染 的基本原理以及栅格化的三维场景数据,在此场景基础上,应用立体视觉原理,自适应的
5生成立体像对,基于不同的立体显示模式,驱动显卡进行立体输出。
本发明的应用目标是所有利用3D显示原理基于3D API实现单通道透视立体显示的计 算机软件,在不更改这些软件的源代码、二进制代码或计算机硬件结构的情况下,使该计 算机软件实现双目视觉的立体真三维显示与观测。
本发明依赖的技术基础是计算机图形学中关于三维渲染的基本模型,涉及三维渲染流 水线、顶点的变换流水线、Z缓冲区算法等。实现依据是主流的3D API和显卡均是基于该 模型进行工作的,绝大多数三维渲染应用软件均是在这些3D API基础上开发的。
计算机三维显示的基本原理是将三维场景经过几何变换和光照处理以及栅格化之后,生 成一幅二维栅格图像在输出设备上输出。三维场景中包含一系列的三维对象,三维对象是 由一系列顶点构成的几何图元(包括点,线和三角形)组合而成。顶点是一个包含三维空 间位置及其对应的渲染参数的坐标点。首先对顶点数据进行透视坐标变换和光照处理。在 坐标变换阶段,描述物体几何形状的顶点被变换到视点为中心的坐标系下,再进行光照计 算确定每个顶点应该具有的颜色和亮度。计算机图形学的基本显示单元是像素,这些几何 对象被栅格化成像素,最后这些像素被送到帧缓存中等待显示,如图2所示。
在三维图形渲染中存在着一系列的坐标变换,最后将物体本身的坐标变换成二维屏幕 上的像素坐标。这些坐标变换都是将上一步变换结果作为输出的,构成一个顶点坐标变换 的流水线,如图3所示。所有三维对象的坐标均被统一到了同一个坐标系下,经过投影和裁 剪形成规格化的坐标,通过栅格化变换形成图像像素。
Z缓冲区算法又称深度缓冲算法。由于二维平面坐标在透视投影下可以对应无限多个三 维坐标。所以栅格化的几何对象包含了每个像素对应的到视点称为深度值的参数,如果栅 格化几何对象像素的深度值小于原来像素,就用这个像素的值代替原来位置的值,这就保 证了总是距离视点最近的像素被保存下来。
针对以上原理,实现本发明目的的技术方案是-计算机显卡的植入式真三维立体驱动方法,该方法包括以下步骤 步骤(1)对3D API进行监控,在三维可视化程序与显卡之间拦截3D API关键函数, 获取场景渲染数据;
步骤(2)利用场景变换矩阵和投影变换矩阵重构栅格化的三维数据;
步骤(3)自适应屏幕分辨率和人的眼基距设定两个不同的视点位置并生成立体像对;
步骤(4)针对不同的立体观察设备进行真三维观测。本发明的方法具体可用下列步骤实现,下列步骤不分先后
a. 监控创建三维显示环境的函数,在该函数中加入调用3D API的系统检测函数功能, 获取系统立体显示特性,根据相应的立体显示特性,更改原始设定的显示环境中的立体显 示模式,在支持立体显示的硬件上开启真三维立体显示支持,在不支持立体显示的硬件上, 设置标志以便进行红绿立体显示;
b. 监控开始一帧绘制的函数,在该函数中加入代码获取当前绘图帧的视口尺寸,根据渲 染的像素格式为立体像对创建临时的缓冲区;
c. 监控改变当前绘制矩阵的函数,在该函数中加入代码以获取三维应用软件对当前绘 制矩阵的更改,通过矩阵参数识别场景渲染的投影类型,当是透视投影时,记录该矩阵, 作为三维场景重构的关键参数;
d. 监控将帧缓存输出到显示设备的函数,在监控函数加入代码以获取整个帧中各像素 的颜色和深度数据,基于步骤C获取的投影变换矩阵信息,反算每个像素在视点坐标系下 的三维坐标,重建出基于像素的栅格化的三维场景;根据人眼睛的立体视觉模型,生成可 供立体显示的立体像对。
所述步骤(1)中3DAPI的监控与渲染数据拦截进一步包括利用API拦截技术,获取 三维绘制相关矩阵和三维渲染数据输出,提取实现三维透视变换的投影矩阵、视口宽高, 作为三维场景重构的关键参数;利用3D API的特定函数,拦截三维渲染输出,提取显卡帧 缓存中的颜色和深度数据,作为三维场景重构的基础。
3D API拦截是指利用计算机编程技术,对三维应用软件中的3D API函数调用进行监控, 并对3D API产生的渲染数据进行拦截在其中插入自定义代码,达到对原有API进行监控或 重新实现的目的。API拦截技术成熟且应用广泛,如屏幕取词软件、反病毒软件、网络防火 墙等等。本发明所指的3D API渲染拦截是指拦截特定功能的若干关键3D API函数。
所述步骤(1)中还进一步包括针对其实现3D API关键函数的拦截的具体步骤针对 3D API,通过代码注入或/和钩子函数技术编写特定的拦截程序,在三维可视化程序的数据 加载阶段,将3D API拦截程序加载到三维可视函数化程序的进程中,从而拦截和监控3D API 调用。本发明所指需要拦截的3D API关键函数如下
(21) 3D API创建三维显示环境的函数;
(22) 3D API开始一帧场景渲染的函数;(24) 3D API结束一帧场景渲染的函数的;
(25) 3D API将渲染数据输出到当前屏幕上的函数。
所述步骤(2)进一步包括利用3DAPI输出到显卡帧缓存中的颜色和深度数据,结合拦 截3D API调用而获得的投影参数,来解析生成颜色图像和深度数据的三维空间信息。艮卩, 通过生成三维渲染输出的投影矩阵和视口宽高,解算出三维渲染关键控制参数(视点位置、 近平面、远平面)以及三维渲染输出的颜色和深度数据,进而解算出每个像素在视空间中 的三维坐标以及对应的颜色特性,重构视空间下栅格化的三维场景数据。它具体可以包含 以下步骤
I. 透视投影变换矩阵的识别。在一帧场景的渲染过程中,三维应用软件可能会多次更 改投影变换矩阵,只有透视变换矩阵才可以产生透视三维效果。不失一般性,假设3D应用 软件在一帧的渲染过程中保持一致,将透视投影矩阵拦截下来,将矩阵中的特征值作为判 据,判断当前拦截的矩阵是否为透视投影矩阵。
II. 建立视点为坐标原点的三维空间坐标系(简称视点坐标系)。以步骤I截获的透视投 影变换矩阵为参数,建立以透视点为坐标原点的视图坐标系Z轴穿过近平面的中心,近平 面的Y轴和X轴方向和该坐标系的X轴,Y轴方向一致,近平面位于近平面值对应的Z轴的 刻度上。近平面上X的值域是[-width/2, width/2],Y的值域是[-height/2, height/2]。在 该坐标系中,任意坐标点P(X,Y,Z)与近平面的交点的坐标值P' (X', Y', Z')可以由透 视投影矩阵变换求得,其中Z'对应于帧深度缓存中的深度值。可得X'等于width/2々X/Z ; Y'等于height/2*Y/Z; Z,等于(z-zNear)/z * zFar/(zFar-zNear),其中Z'对应于深度缓 存中的值。
ni.栅格化三维场景数据的重构。设视口的宽度为width'、高度为height',可由3D API 相关函数获得。由视口和近平面的比例关系可知任意三维渲染帧图像像素点的坐标 P'' , (X''' , Y,'')对应于近平面上的三维坐标Pn(xn , yn , zn), 其中 xn=(X,' , -width' /2)*width/2, yn=(Y, ,' -height' /2) *height/2。对应的深度缓存中的值 Z',由步骤II可知,对应的视点坐标系下Z值为Z' *(zFar-zNear)/zFar+zNear,可得像素 点在视点坐标系下的坐标P(X, Y, Z),其中X等于xNear/zNear*Z, Y等于yNear/zNear*Z。
通过调用3D API的读取显卡中颜色缓冲区函数和深度缓冲区函数,利用步骤II中建 立的坐标系以及上述关系,可以获得视点坐标系下所有像素点的三维坐标。将所有的三维坐 标用三角形面片连接起来,就构成了一个可进行三维渲染的立体表面,该表面通过三维流
8水线,在任意视角下进行渲染。
所述步骤(3)中"设定两个不同的视点位置并生成立体像对"是利用步骤(2)重构的三维场景,生成两幅影像,形成立体像对。本发明提出基于"立体像素"的三维场景的立体显示模型,所谓立体像素是指将步骤(2)重构的三维场景的每个像素与其对应视点空间的三维坐标一起组成序列[(X,Y,Z), (R,G,B)],构成的一个三维像素空间。针对该空间中的每个像素,按照透视变换原理,计算出其在新视点的像素位置点。
生成立体像对可采用下列两种方法
方法一.调用3D API,渲染步骤(2)中获得的场景数据,在原始图像作为左视点图像情况下,生成右视点图像;在原始图像作为右视点图像情况下,生成左视点图像;在不保存原始图像情况下,生成左右视点图像,从而实现立体像对生成。
方法二.采用栅格化三维场景数据,构建原始视空间与目标视空间下像素的映射关系,将原始视空间下的像素直接变换到目标视空间下。在原始图像作为左视点图像情况下,生
成右视点图像;在原始图像作为右视点图像情况下,生成左视点图像;在不保存原始图像
情况下,生成左右视点图像,从而实现立体像对快速生成。其中
视点水平偏移,是指新视点距离原始视点在X轴方向上的改变量A 。视点垂直偏移,是指新视点距离原始视点在Z轴方向上的改变量A。图像像素偏移,是指生成的图像像素水平方向的附加偏移Aw。
则在另一的视点坐标系下,对原始帧图像中点P(X,Y,Z)的像素标在左视点下的坐标X是Width' *(X-Dx)/(Z-Dz)+Dpixel, Y是Height' *Y/(Z-Dz)。该像素在对于右视点坐标系下,坐标按照上述方法计算,但Dx,Dz取负号。
将每个像素的颜色复制到目标位置。对两个视点都应用该方法从而获得立体像对。该方法具有不经过图形流水线,程序编制简单,优化容易等优点。
所述步骤(4)中"针对不同的立体观察设备进行真三维观测"是指将步骤(3)生成的立体像对,通过显示设备输出并进行立体观察。本发明生成的立体像对通过如下方式进行真三维显示
x.显卡支持的双目立体显示。如在支持立体显示的0penGL API环境下,在创建设备句柄阶段启动0penGL API的立体显示模式,将生成的立体像对分别输送到左右两个缓冲区中,实现立体显示。y.在不支持立体显示的显卡上,将立体像对合成为一幅红绿互补色立体图像,从左右立
体像对中的一个图像提取红色通道,另一个图像中提取绿色和蓝色通道,将提取的通道融合,形成一个互补色的立体图像。并送回原始的图像缓冲区进行立体显示与观测。
z.将立体图像或像对输送到其他支持立体显示设备上。
(1) 本发明旨在解决现阶段已经大量存在的三维应用软件不能支持立体真三维立体
显示的问题,依靠对3D API的拦截与监控对三维场景渲染的关键参数和结果数据进行捕获与解析。通过捕获的投影变换矩阵,获取反算三维场景的关键参数,通过捕获的渲染颜色和深度数据,逐像素反求其三维坐标,并将像素值映射到对应的位置上,形成立体像对。通过多种显示设备进行立体显示与观测,在根本上解决了三维立体显示的门槛问题。本发
明具有如下特色
(2) 解决了现有大量三维程序进行直接立体显示的问题,使得大量已有的三维显示程
序不经过重新开发直接进行立体显示,保护了原来的投资。
(3) 实现的算法新颖,通过利用生成的颜色图像和深度图像经过重新分配形成立体像对,算法原理简单,编程实现方便,有利于硬件直接实现与固化,可以扩展为显卡的直接支持功能。
(4) 充分利用了现有的技术资源,由于基于工业标准的3DAP1开发,具有良好的适应性,对于显卡没有特殊要求。
(5) 支持多种显示模式,可以在任意显示环境下实现立体显示。


图1本发明实施例1的方法流程图
图2本发明采用的三维渲染的基本模式
图3本发明采用的三维图形的坐标变换流水线
图4本发明实施例1的透视投影与透视变换矩阵
图5本发明实施例1的以视点为中心的坐标系
图6本发明实施例1的立体像对的快速生成方法图
具体实施例方式
下面结合附图和实施例对本发明做进一步详细说明。实施例l
10目前普遍应用的3D API有DirectX、 0penGL、 Glide、 Heidi等。如图2和图3所示, 本实施例采用OpenGL 3D API作为实施对象,操作系统平台为Windows XP进行。针对计算 机显卡的植入式真三维立体驱动方法基于说明书之原理,OpenGL API的拦截与监控基于 Micorsoft Detours SDK幵发。Detours是Microsoft提供的一套Windows平台下进行API 调用拦截的开发包,支持Win32所有应用。
如图1所示, 一种计算机显卡的植入式真三维立体驱动方法,该方法包括以下步骤 步骤(1)针对三维应用软件使用的OpenGL API进行监控,拦截OpenGL API关键函数, 获取场景渲染数据;
步骤(2)利用场景变换矩阵和投影变换矩阵重构栅格化的三维数据;
步骤(3)自适应屏幕分辨率和人的眼基距设定两个不同的视点位置并生成立体像对;
步骤(4)针对不同的立体观察设备进行真三维观测。
步骤(1)中OpenGL API的拦截与获取场景渲染数据进一步包括利用OpenGL API拦 截技术,获取三维绘制相关矩阵和三维渲染数据,提取实现三维透视变换的投影矩阵、视 口宽高,作为三维场景重构的关键参数;利用OpenGLAPI的特定函数,拦截三维渲染输出, 提取显卡帧缓存中的颜色和深度数据,作为三维场景重构的基础。
步骤(2)进一步包括利用OpenGL API输出到显卡帧缓存中的颜色和深度数据,结合拦 截OpenGL API调用而获得的投影参数,来解析生成颜色图像和深度数据的三维空间信息。 它进一步包含以下步骤
I.透视投影变换矩阵的识别。在一帧场景的渲染过程中,三维应用软件可能会多次更 改投影变换矩阵,只有透视变换矩阵才可以产生透视三维效果。不失一般性,假设透视投 影变换矩阵在一帧的渲染过程中保持一致。透视投影的各项控制参数与对应的矩阵关系见 附图4所示。将透视投影矩阵拦截下来,将矩阵中的特征值作为判据,判断当前拦截的矩 阵是否为透视投影矩阵。
II.建立视点为坐标原点的三维空间坐标系(简称视点坐标系)。以步骤I截获的透视投 影变换矩阵为参数,建立以透视点为坐标原点的视图坐标系Z轴穿过近平面的中心,近平 面的Y轴和X轴方向和该坐标系的X轴,Y轴方向一致,近平面位于近平面值对应的Z轴的 刻度上。近平面上X的值域是[iidth/2, width/2], Y的值域是[-height/2, height/2]。在 该坐标系中,任意坐标点P(X,Y,Z)与近平面的交点的坐标值P' (X', Y', Z')可以由透 视投影矩阵变换求得,其中Z'对应于帧深度缓存中的深度值,如附图5所示。可得X'等于 width/2*X/Z ; Y,等于height/2*Y/Z; Z'等于(z-zNear)/z * zFar/(zFar-zNear),其中Z'对应于深度缓存中的值。
III.栅格化三维场景数据的重构。设视口的宽度为width'、高度为height',可由0penGL API相关函数获得。由视口和近平面的比例关系可知任意三维渲染帧图像像素点的坐标 P''' (X''' , Y''')对应于近平面上的三维坐标Pn(xn , yn , zn), 其中 xn-(X''' -width' /2)*width/2, yn=(Y,'' -height' /2) *height/2。对应的深度缓存中的值 Z',由b可知,对应的视点坐标系下Z值为Z' *(zFar-zNear) /zFar+zNear,可得像素点在视 点坐标系下的坐标P(X, Y, Z),其中X等于xNear/zNear*Z, Y等于yNear/zNear*Z。
通过调用OpenGL API的读取显卡中颜色缓冲区函数和深度缓冲区函数,利用步骤II 中建立的坐标系以及上述关系,可以获得视点坐标系下所有像素点的三维坐标。将所有的三 维坐标用三角形面片连接起来,就构成了一个可进行三维渲染的立体表面,该表面通过三 维流水线,在任意视角下进行渲染。
步骤(3)利用步骤(2)重构的三维场景,生成两幅影像,形成立体像对。 生成立体像对可采用下列两种方法
方法一.调用OpenGL,渲染步骤(2)中获得的场景数据,在原始图像作为左视点图像 情况下,生成右视点图像;在原始图像作为右视点图像情况下,生成左视点图像;在不保 存原始图像情况下,生成左右视点图像,从而实现立体像对生成。
方法二.采用栅格化三维场景数据,构建原始视空间与目标视空间下像素的映射关系, 将原始视空间下的像素直接变换到目标视空间下。在原始图像作为左视点图像情况下,生 成右视点图像;在原始图像作为右视点图像情况下,生成左视点图像;在不保存原始图像 情况下,生成左右视点图像,从而实现立体像对快速生成。其中
视点水平偏移,是指新视点距离原始视点在X轴方向上的改变量A 。
视点垂直偏移,是指新视点距离原始视点在Z轴方向上的改变量A。
图像像素偏移,是指生成的图像像素水平方向的附加偏移Aw。
则在另一的视点坐标系下,对原始帧图像中点P(X,Y,Z)的像素标在左视点下的坐标X 是Width, Dx)/(Z-Dz)+D—" Y是Height' *Y/(Z-Dz)。该像素在对于右视点坐标系下, 坐标按照上述方法计算,但Dx,Dz取负号。
将每个像素的颜色复制到目标位置。对两个视点都应用该方法从而获得立体像对。该 方法具有不经过图形流水线,程序编制简单,优化容易等优点。
步骤(4)将步骤(3)生成的立体像对,通过显示设备输出并进行立体观察。本发明生成 的立体像对通过如下方式进行真三维显示x.显卡支持的双目立体显示。如在支持立体显示的OpenGL环境下,在创建设备句柄阶 段启动OpenGL的立体显示模式,将生成的立体像对分别输送到左右两个缓冲区中,实现立 体显示。或
y.在不支持立体显示的显卡上,将立体像对合成为一幅红绿互补色立体图像,从左右立 体像对中的一个图像提取红色通道,另一个图像中提取绿色和蓝色通道,将提取的通道融 合,形成一个互补色的立体图像。并送回原始的图像缓冲区进行立体显示与观测。或 z.将立体图像或像对输送到其他支持立体显示设备上。
下面的实施过程是上述方法的具体软件编码过程。
1. 基于Detours API,在Windows XP平台下基于Visual Studio 2005建立0++语言的 Win32 DLL工程,命名为StereoDriver。
2. 在StereoDriver中定义一个数据结构OpenGL—Stereo,该数据结构包含如下内容
(1) Windows绘图上下文变量hDC,类型HDC;
(2) OpenGL渲染上下文变量hGLRC,类型HGLRC;
(3) 记录当前硬件是否支持立体显示的变量IsStereoSu卯ort,类型bool;
(4) 记录视口宽高的变量width, height,类型int;
(5) 缓存颜色数据的变量ColorBuffer,类型GLbyte*;
(6) 缓存深度数据的变量D印thBuffer,类型GLfloat;
(7) 记录当前变换矩阵模式的变量MatrixMode,类型GLMatrixMode
(8) 记录当前透视投影矩阵的变量Matrix,类型GLfloat[4] [4]
(9) 创建一个全局的链表gOpenGL—Stereos保存OpenGL_Stereo结构的指针。
(10) 创建一个全局的OpenGL—Stereo指针ActiveOpenGL—Stereo,初始化为NULL。 (4)基于Detours API实现对如下函数的监控
1) wglCreateCorvtext
wglCreateContext根据应用程序的设置,创建一个相应的OpenGL的渲染上下文。创建 监控函数My一wglCreateCorrtext,在wglCreateContext中实现如下功能
解析wglCreateContext的参数,判断用户程序是否使用PFD—STEREO标记启动双通道 立体渲染支持,如果用户程序启动立体渲染支持,则说明用户程序本身支持立体渲染。
如果用户程序没有启动立体渲染支持,则表明用户程序不支持立体渲染,询问用户是否 启动植入式立体支持。如果用户选择启用植入是立体支持,创建OpenGL—Stereo结构,并保存在一个包含 OpenGLStereo结构指针的全局列表中,并初始化。使用wglChoosePixelFormat函数和 PF—STEREO标记査询当前显卡是否支持立体显示。如果支持立体显示则将OpenGLStereo的 IsStereoSupport设置为true,否则设置为false。
使用原始的wglCreateContext创建HGLRC,并在OpenGLStereo中记录对应的HDC禾口 HGLRC,将OpenGLStereo结构加入到gOpenGL—Stereos中。
2) wglMakeCurrent
wglMakeCurrent在若干OpenGL渲染上下文中选择一个做为当前活动的, 一般在 wglMakeCurrent之后开始和结束一帧的绘制。创建监控函数My—wglMakeCurrent,在 My—wglMakeCurrent中实现如下功能当HDC参数和HGLRC参数不为NULL时,从 gOpenGL—Stereos中用这两个参数査找对应hDC和hGLRC的OpenGL—Stereo结构,并赋值给 ActiveOpenGL—Stereo变量。如果两个参数均为NULL,则将ActiveOpenGL—Stereo赋值为 NULL。
调用原始的wglMakeCurrent 。
3) glViewport
glVie叩ort将当前活动的OpenGL渲染上下文的视口设置到指定位置和尺寸。创建监控 函数My_glViewport,在My—glViewport中实现如下功能
如果ActiveOpenGL—Stere不为空,则判断新的视口宽高是否和ActiveOpenGL—Stereo中 的width, height相等。如果不相等释放OpenGL—Stereo中原有的ColorBuffer和 D印thBuffer内存;根据视口的宽高创建颜色缓存区ColorBuffer和深度缓存区 D印thBuffer;记录新的width和height。
调用原始的glViewport。
4) glMatrixMode
glMatrixMode设置当前活动OpenGL渲染上下文的活动矩阵模型。创建监控函数 My_glMatrixMode,在My—glMatrixMode中实现如下功能
如果ActiveOpenGL_Stereo不为空,则将ActiveOpenGL一Stere的MatrixMode设置为 glMatrixMode的参数。
调用原始的glMatrixMode。
5) glLoadMatrixd, glLoadMatrixf
glLoadMatrix为活动的Opena渲染上下的当前矩阵模式设置矩阵。创建监控函数
14My一glMLoadMatrix,在My_glLoadMatrix中实现如下功能
如果ActiveOpenGL_Stereo不为空,且其变量MatrixMode等于GL—PROJECTION,则记录 该函数的m变量到ActiveOpenGL—Stere的Matrix中。
调用原始的glLoadMatrix函数。 6) Sw即Buffers
该函数将0penGL渲染的一帧从显存输出到显示设备上。创建监控函数My—SwapBuffers, 在该函数中实现如下功能
如果ActiveOpenGL—Stereo不为空,调用glReadPixels函数,以GL—RGB从颜色缓冲区 中读取颜色到ActiveOpenGL—Stereo的ColorBuffer变量;调用glReadPixels函数以 GL—DEPTH—COMPONENT参数,读取深度值到ActiveOpenGL—Stereo的D印thBuffer中。
从ActiveOpenGL—Stereo的Matrix变量中获得透视投影的近平面的宽度width,高度 height,以及近平面的zNear禾口远平面zFax。
根据ActiveOpenGL一Stereo中记录的视口的宽度ViewPortWidth和ViewPortHeight,创 建临时的颜色缓冲区,ColorBufferLeft和ColorBufferRight。
从用户设置中获得视点偏移D,,深度偏移Dz和像素偏移Dp^。建立一个循环,对每个 ColorBuffer像素,取出对应的像素坐标iX, iY以及颜色RGB以及对应的D印thBuffer中的 深度值。利用本发明设计的方法,像素对应的视点坐标系中的坐标P (X,Y,Z)。对左眼以 Dx,Dz.Dpw为参数。使用本发明设计的快速立体像对生成算法,计算P对应的像素坐标Pun。 对右眼以-Dx. -Dz. -DpM为参数.使用本发明设计的快速立体像对生成算法,计算P对应的右像 素坐标P^t。将当前像素的颜色分别赋值给ColorBufferLeft的P^位置,和 ColorBufferRight的P^t位置。
判断ActiveOpenGL—Stere的IsStereoSupport是否为真。如果为真,调用glDrawPixels 分别将ColorBufferLeft和ColorBufferRight中的内容拷贝到GL_BACK_LEFT和 GL—BACK—RIGT中。否则,将ColorBufferRight中的G, B通道赋值到ColorBufferLeft对 应像素的G, B通道上去,形成一幅红绿立体,将ColorBufferLeft的内容拷贝到GL—BACK中。
调用原始的SwapBuffer。
4. 编译StereoDriver工程,生成StereoDriver. DLL文件
5. 将StereoDriver. DLL文件通过detours SDK的withdll. Exe命令行启动需要立体显示的 三维渲染程序。
权利要求
1、一种计算机显卡的植入式真三维立体驱动方法,其特征是,该方法包括以下步骤步骤(1)对3D API进行监控,在三维可视化程序与显卡之间拦截3D API关键函数,获取场景渲染数据;步骤(2)利用场景变换矩阵和投影变换矩阵重构栅格化的三维数据;步骤(3)自适应屏幕分辨率和人的眼基距设定两个不同的视点位置并生成立体像对;步骤(4)针对不同的立体观察设备进行真三维观测。
2、 根据权利要求1所述的真三维立体渲染方法,其特征是,所述真三维立体渲染方法 进一步包括下列步骤,下列步骤不分先后a. 监控创建三维显示环境的函数,在该函数中加入调用3D API的系统检测函数功能, 获取系统立体显示特性,根据相应的立体显示特性,更改原始设定的显示环境中的立体显 示模式,在支持立体显示的硬件上开启真三维立体显示支持,在不支持立体显示的硬件上, 设置标志以便进行红绿立体显示;b. 监控开始一帧绘制的函数,在该函数中加入代码获取当前绘图帧的视口尺寸,根据 渲染的像素格式为立体像对创建临时的缓冲区;c. 监控改变当前绘制矩阵的函数,在该函数中加入代码以获取三维应用软件对当前绘 制矩阵的更改,通过矩阵参数识别场景渲染的投影类型,当是透视投影时,记录该矩阵, 作为三维场景重构的关键参数;d. 监控将帧缓存输出到显示设备的函数,在监控函数加入代码以获取整个帧中各像素 的颜色和深度数据,基于步骤c获取的投影变换矩阵信息,反算每个像素在视点坐标系下 的三维坐标,重建出基于像素的栅格化的三维场景;根据人眼睛的立体视觉模型,生成可 供立体显示的立体像对。
3、根据权利要求1所述的真三维立体渲染方法,其特征是,所述步骤(1)中3D API 的监控与渲染数据拦截进一步包括利用API拦截技术,获取三维绘制相关矩阵和三维渲 染数据输出,提取实现三维透视变换的投影矩阵、视口宽高,作为三维场景重构的关键参 数;利用3D API的特定函数,拦截三维渲染输出,提取显卡帧缓存中的颜色和深度数据, 作为三维场景重构的基础。
4、根据权利要求1所述的真三维立体渲染方法,其特征是,所述步骤(1)中还进一 步包括针对其实现3D API函数的拦截的具体步骤通过代码注入或/和钩子函数技术编写特定的拦截程序,在三维可视化程序的数据加载阶段,将3D API拦截程序加载到三维可 视化程序的进程中,从而拦截和监控3D API调用。
5、 根据权利要求1所述的真三维立体渲染方法,其特征是,所述步骤(2)进一步包 括下列步骤通过生成三维渲染输出的投影矩阵和视口宽高,解算出三维渲染关键控制参 数以及三维渲染输出的颜色和深度数据,进而解算出每个像素在视空间中的三维坐标以及 对应的颜色特性,重构视空间下栅格化的三维场景数据。
6、 根据权利要求1所述的真三维立体渲染方法,其特征是,所述步骤(2)进一步包 含以下步骤I. 透视投影变换矩阵的识别假设透视投影变换矩阵在一帧的渲染过程中保持一致,将透视投影矩阵拦截下来,将矩阵中的特征值作为判据,判断当前拦截的矩阵是否为透视投影矩阵;II. 建立视点为坐标原点的三维空间坐标系以步骤I截获的透视投影变换矩阵为参 数,建立以透视点为坐标原点的视图坐标系Z轴穿过近平面的中心,近平面的Y轴和X 轴方向和该坐标系的X轴,Y轴方向一致,近平面位于近平面值对应的Z轴的刻度上;近平面上X的值域是[-width/2, width/2],Y的值域是[-height/2, height/2];在该坐标系中, 任意坐标点P(X,Y,Z)与近平面的交点的坐标值P' (X', Y', Z')由透视投影矩阵变换求 得,其中Z'对应于帧深度缓存中的深度值,X'=width/2*X/Z ; Y'=height/2*Y/Z; Z、(z-zNear)/z * zFar/(zFar-zNear),其中Z'对应于深度缓存中的值;III. 栅格化三维场景数据的重构设视口的宽度为width'、高度为height',任意三 维渲染帧图像像素点的坐标P''' (X''', Y''')对应于近平面上的三维坐标Pn(xn, yn, zn), 其中xn=(X, , , -width' /2)*width/2, yn=(Y,'' -height' /2) *height/2;对应的深度缓存中 的值Z',对应的视点坐标系下Z=Z' *(zFar-zNear)/zFar+zNear,像素点在视点坐标系下的 坐标为P(X, Y, Z),其中X=xNear/zNear*Z, Y=yNear/zNear*Z;将所有的三维坐标用三角形 面片连接起来,就构成了一个可进行三维渲染的立体表面。
7、 根据权利要求1所述的真三维立体渲染方法,其特征是,所述步骤(3)中生成立体 像的方法是调用3D API,渲染所述步骤(2)中获得的场景数据,在原始图像作为左视 点图像情况下,生成右视点图像;在原始图像作为右视点图像情况下,生成左视点图像; 在不保存原始图像情况下,生成左右视点图像,从而实现立体像对生成。
8、 根据权利要求1所述的真三维立体渲染方法,其特征是,所述步骤(3)中生成立体 像的方法是采用栅格化三维场景数据,构建原始视空间与目标视空间下像素的映射关系,将原始视空间下的像素直接变换到目标视空间下;在原始图像作为左视点图像情况下,生 成右视点图像;在原始图像作为右视点图像情况下,生成左视点图像;在不保存原始图像 情况下,生成左右视点图像,从而实现立体像对快速生成。
9、 根据权利要求1所述的真三维立体渲染方法,其特征是,所述步骤(4)中针对不同 的显示与观测设备,进行立体显示与观测,包括x.在支持立体显示的设备上,将立体像对分别输出到显卡左右两个通道,进行立体显示5或y.在不支持立体显示的设备上,将立体像对中, 一个图像提取红色通道,另一个图像 提取绿色和蓝色通道,将提取的通道融合,形成一个互补色的立体图像,并支持红绿眼镜 观察;或z.将立体图像或像对输送到其他支持立体显示设备上。
10、 根据权利要求1所述的真三维立体渲染方法,其特征是,所述需要拦截的3DAPI关键函数包括(21) 3D API创建三维显示环境的函数;(22) 3D API开始一帧场景渲染的函数;(23) 3D API改变当前渲染矩阵的函数;(24) 3D API结束一帧场景渲染的函数;(25) 3D API将渲染数据输出到当前屏幕上的函数。
全文摘要
本发明涉及一种针对计算机显卡的植入式真三维立体驱动方法,该方法包括在三维可视化程序到显卡之间采用植入式的渲染数据拦截技术,对原始的单通道颜色信号和深度信号、三维场景变换矩阵和投影变换矩阵进行捕获;对这些信息进行解析,重构栅格化的三维数据;基于立体视觉原理,自适应地将该场景重新变换到两个不同的视点位置,形成可供立体显示的双目视觉立体像对,驱动显卡对双目立体像对进行立体输出;利用偏振、红绿和闪闭式眼镜等进行真三维立体显示与观测。本发明可以实现现有三维可视化软件在不改变程序和操作模式的情况下进行真三维立体化的场景展示。
文档编号G06T15/00GK101477702SQ200910025519
公开日2009年7月8日 申请日期2009年2月6日 优先权日2009年2月6日
发明者吴明光, 温永宁, 盛业华, 闾国年 申请人:南京师范大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1