具体实施方式
本发明针对用于在图像呈现过程期间执行α修正以便补偿γ修正的缺乏的方法、系统和对应的计算机程序产品。本发明的实施例可以包括包括各种计算机硬件的专用或通用计算机,或者,利用该专用或通用的计算机来加以执行,以下将对此进行更加详细的讨论。特别地,可以利用图形处理单元(GPU)来实现本发明的实施例。
本发明的范围以内的实施例也包括用于携带或其上存储有计算机可执行指令或数据结构的计算机可读介质。这种计算机可读介质可以是可由通用或专用的计算机进行存取的任何可用的介质。举例来讲(不作限制),这种计算机可读介质可以包括RAM、ROM、EEPROM、CD-ROM或其他物理存储介质(例如,光盘存储、磁盘存储或其他磁性存储设备)、或可以用来携带或存储采取计算机可执行指令或数据结构形式的所需程序代码方法并且可以由通用或专用的计算机来进行存取的其他任何介质。当在网络或另一个通信连接(有线、无线,或者有线或无线的组合)上将信息传送或提供给计算机时,计算机适当地将此连接视作计算机可读介质。这样,任何这类的连接都可以被适当地称作“计算机可读介质”。以上内容的组合也应该被包括在计算机可读介质的范围以内。例如,计算机可执行指令包括使通用计算机、专用计算机或专用处理设备(例如,GPU)执行某种功能或某组功能的指令和数据。
α修正
图1展示了一种方法的流程图100,该方法用于修正过滤的α值,以便补偿γ修正的缺乏。在字体图示符呈现过程中,为用来显示字体图示符的每个像素导出过滤的α值(也被称作“混合系数”)。在某些实施例中,只为每个显示像素计算单一α值。在其他实施例中,利用微软的ClearType_技术,为每个像素子分量(例如,“红色”子分量、“绿色”子分量和“蓝色”子分量)计算单独的α值。相应地,应理解,本发明扩展到各种实施例,因此,并不局限于其中只为每个显示像素导出一定数量的α值的实施例。
如图1所示,一种用于修正过滤的α值以便补偿γ修正的缺乏的方法包括各种动作(动作110、120、140、150和160)和一个步骤(步骤130),现在将特别参照图2-5来更加详细地描述每个动作和步骤。
第一个所展示的动作包括:接收可以用于图形混合过程的过滤的α值(动作110)。在混合期间和在γ修正之前,这些过滤的α值通常用于现存的字体图示符呈现过程中。但是,根据本发明,使用这些过滤的α值,来导出可用于混合显示像素的前景颜色和背景颜色的被调整或修正的α值,利用这种方法,不需要进行混合后γ修正。过滤的α值(可以从任何来源获得)通常描述将被显示的字体图示符的形状。
所展示的这种方法也包括接收显示像素前景颜色的动作(动作115)。如以下特别参照图2-5所描述的,通过接收显示像素前景颜色,本发明可以根据已知的前景颜色和最优修正系数来执行所需的α修正。
根据图1,为一个或多个γ值中的每个γ值计算一组修正系数(动作120)。注意,这套修正系数不需要从计算中导出,而是可以在可选实施例中手工调整。也可以在软件设计时执行动作120,而图1中所有其他的动作可以在呈现图像时加以执行。
在本实施例中,每个γ值与四个修正系数(包括c1、c2、c3和c4)关联。可以为γ值的任何所选择的范围计算这些修正系数。将被用来呈现字体图示符的显示设备的γ值最好被包括在内,作为所选择的那组γ值中的一个。在一个实施例中,所选择的那组γ值包括范围在1.0与2.2之间、步长为0.1的γ值,尽管这个范围可能会发生变化。
根据一个实施例,通过在软件设计时执行图2中的流程图200所展示的各个动作,来实现计算与各种γ值相对应的那组修正系数的动作。第一个所展示的动作包括:将γ设置为所选择的γ值范围内的最低的γ值(例如,根据以上所提供的范围,是1.0)(动作210)。接下来,使用该γ值来执行约束优化(动作220),以确定与该γ值相对应的那组最优修正系数。根据一个实施例,通过将约束优化例行程序与图3中的流程图300所展示的各个动作进行组合,来实现这一点。
图3中的流程图300包括多个动作,可以执行这些动作,以便最小化所混合的前景颜色和背景颜色的真实输出与修正的输出之间的计算误差。特别是,通过使用α、前景、背景和修正系数c1、c2、c3和c4的各种预定的值,来计算亮度的真实输出与修正的输出之间的差。这样做可以帮助约束优化例行程序确定与预定的γ值(例如,显示设备的γ值)有关联的最优修正系数。
最初,将前景、背景和α值设置为零(动作310-316)。接下来,使用满足一组预定约束的第一组修正系数,来计算修正的α(动作320)。根据一个实施例,从公式(αcorrected=α+α(1-α)(c1αf+c2α+c3f+c4))中导出修正的α,其中,αcorrected是修正的α,α是α,f是γ修正前景亮度。修正的α公式被示作功能性图表400,并且在图4中采取其基本形式410。
在一个实施例中,在此约束优化(动作220)期间所利用的那组预定的约束包括:(c4≥-1);(c3+c4≥-1);(c1+c2+c3+c4≤1);(c4≥-4);(c3+c4≥-4)。选择这些约束,以确保:图4中的修正是单调的,并且不会产生[0,1]以外的值。但是,这套约束只说明一组合适的约束,这套合适的约束可以被加以利用,因此不应该被解释为限制本发明的范围。在约束优化期间,将在约束范围内递增地调整修正系数的值,以计算每个可能的值f、α和B(背景)的真实输出与修正的输出之间的误差,在大约0.02的递增步长中,f、α和B的范围在大约0与大约1之间。
通常通过使用来自动作320的修正的α值,来计算所计算的输出。特别是,所计算的输出包括γ修正前景f=F(1/γ)和γ修正背景b=B(1/γ)的混合值,其中,f是γ修正前景,F是预定的前景值,γ是γ值,b是γ修正背景,B是预定的背景值。根据动作330来计算修正的输出。
也通过将预定前景(F)和具有α(α)的预定背景(B)进行混合,来计算真实输出(动作340)。其后,修正的输出与真实输出之间的平方差进行自乘(动作342),并乘以重要性权数(346)。最后,将权数的平方差加入误差值(动作346)。然后,如动作(348、350、352、354、356和358)所确定的,重复这些动作,直到已使用F、B和α的所有的值来计算误差为止。然后,利用c1、c2、c3和c4的各种组合来反复重新计算该误差,直到为F、B和α的每个组合处的预定γ值确定最小的误差为止。然后,将该误差返回到图3所示的优化例行程序(动作360)。
图3中所展示的动作包括一种用于计算适合约束优化的费用函数的合适的方法。约束优化例行程序需要利用这类费用函数来找到最小的误差。一种合适的约束优化例行程序是Matlab的fmincon函数,它实现“连续二次规划”。Matlab的fmincon函数和“连续二次规划”在该技术领域中众所周知。但是,应理解,前述例子只是起说明性的作用,所以,不应该被解释为限制本发明的范围。特别是,也可以使用其他技术和算法来获得在预定的一组约束以内并对应于预定的那套γ值的最优修正系数。例如,如果在γ修正的空间(与线性空间相对)中计算误差,那么,图3中所计算的费用函数是修正系数c1、c2、c3、c4中的二次方程式。所以,可以用分析方法(解释线性系统)来执行优化,并且,优化不需要约束优化例行程序。
如图2所示,然后,从约束优化中获得的最优修正系数c1、c2、c3、c4与曾被用来获得最优系数c1、c2、c3、c4的γ值关联(动作230)。例如,在表格或其他数据结构中,可以在最优修正系数与对应的γ值之间进行关联。曾被用来获得最小误差的值F、B和α也可以与这些最优系数有关联,供以后参考。如动作240和250所示,反复执行优化例行程序200,直到已为预定的γ值范围内的每个γ值确定最优修正系数为止。
将最优系数和γ值关联的数据结构可以被存储在一个或多个计算机可读介质中,(例如)作为软件包的一部分。当需要对图像进行光栅化时,将修正系数提交给GPU,在字体图示符呈现过程中使用。在一个实施例中,关联数据结构被直接存储在GPU中。在另一个实施例中,关联数据结构初步在被存储在GPU中之前跟前景颜色值和/或一些约束组合,以便配合特殊的硬件要求。
在图像呈现期间,使用关联数据结构,对GPU所接收的过滤的α值执行α修正(步骤130)。应理解,步骤130可以包括用于执行α修正的任何数量的对应的动作。在一个实施例中,执行α修正的步骤(步骤130)包括选择与显示器的预定γ值相对应的那组修正系数(动作140)的各个对应的动作。例如,通过使用以上所描述的关联数据结构并选择已与显示器的γ值有关联的修正系数,可以实现这一点。根据一个首选实施例,在显示呈现时执行选择或接收修正系数的动作(动作140),而在设计时执行计算那组所选择的修正系数的动作(动作120)。
接下来,使用修正系数和前景颜色来计算修正的α值,这些修正的α值将被用来混合显示像素的前景和背景(动作150)。在一个实施例中,通过使用以上根据图4所展示和描述的公式410,来实现这一点。特别是,αcorrected=α+α(1-α)(c1α+c2α+c3f+c4),其中的c1、c2、c3和c4包括修正系数,其中的f是显示像素的已知前景颜色,其中的α是显示像素的已知α值。如上所述,对于每个显示像素而言,可以计算修正的α值任何次数。举例来讲(不作限制),可以为显示像素的每个像素子分量计算修正的α。特别是,包括“红色”像素子分量、“绿色”像素子分量和“蓝色”像素子分量的显示像素可以包括三个过滤的α值,使用这三个过滤的α值来计算三个修正的α值。应理解,对于利用Microsoft ClearType_呈现技术来呈现字体图示符而言,这一点会特别有用。
一旦计算出修正的α值(动作150),就可以使用它们来执行图形混合过程(动作160),以便将对应的显示像素的前景颜色和背景颜色混合起来。
根据一个实施例,在GPU内执行两个步骤,即,执行α修正的步骤和执行混合操作(动作160)的步骤(步骤130),这有助于提高可行的字体图示符呈现速率。
图5展示了以上所描述的呈现过程的一项实施。但是,应理解,前述实施只是起说明性的作用,所以不应该被解释为限制本发明的范围。精通计算机编程实践技术领域的人可以仿造前述的各个例子。图5中所示的实施例展示:可以在现存的硬件的基础上实行本发明的呈现过程,并可以并行地计算多个颜色通道。
本实施例可以利用基于微软的DirectX_程序包的程序模块来执行本发明,该DirectX_程序包提供各种硬件类型的统一应用程序接口(API)。根据一个实施例,就本项实施假定硬件支持像素着色器版本1.1和混合因素机制(这里和以下使用Microsoft DirectX_术语)而言,它并不是完全独立于设备的。
在图5中,图表500表示硬件块与软件块之间的数据流。输入数据被显示为“γ级别”(512)块、“前景颜色”(514)块和“α质地”(520)块。γ级别是反映显示设备的物理显示特征的数字。使用该γ级别,从预先计算的表格或其他关联数据结构中选择适当的修正系数c1、c2、c3和c4。在“多项式系数计算器”510处选择修正系数。该多项式系数计算器也获得前景颜色,计算对应的比值,并将它们存入像素着色器(540)的恒定寄存器。
将要显示的形状(文本片段)准备成被示作“α质地”块520的二维阵列的α值。对每个像素而言,使用所提供的“取样器1”(530)、“取样器2”(532)和“取样器3”(534)这三个取样器,从α质地中三次取出这些α值。这些取样器为像素着色器540提供红色子分量、绿色子分量和蓝色子分量的α值。
像素着色器540为红色子分量、绿色子分量和蓝色子分量执行非线性计算并生成修正的α值的矢量,将这些颜色子分量提供给输出光栅器550。输出光栅器550通过使用从像素着色器540获得的α值,来提供背景颜色(从呈现靶面560中取得)与前景颜色(作为一个混合因素)之间的线性混合。所产生的颜色值被存储在呈现靶面560处。
像素着色器540处理浮点值的四维矢量。使用后缀.a、.r、.g和.b来引用矢量分量,这些后缀与α分量、红色分量、绿色分量和蓝色分量相对应。能够保存这些矢量的实体被称作“寄存器”(未示出)。像素着色器540运用输入寄存器(tn,即t0、t1、t2等)、恒定寄存器(cn)和临时寄存器(rn),来执行以上所描述的α修正。在以下所提供的例子中,临时寄存器r0用作输出寄存器。
根据本实施例,像素着色器540是可调整的硬件块,它利用用专用汇编语言或其他合适的编程语言所写的计算机可执行指令来加以控制,以执行本发明的某些动作。以下的例子是像素着色器程序的一个实施例,该像素着色器程序包括用于执行每分量线性立方α修正的计算机可执行指令。限据本实施例,为每个像素执行这个程序。如上所述,以下的程序接受最好预先准备好的恒定寄存器c0..c5中的多项式系数。当改变γ级别或前景颜色时,对这些多项式系数进行计算。以下针对像素着色器程序,来解释每个恒定寄存器的含义。
ps.1.1//declare pixel shader version
<!-- SIPO <DP n="8"> -->
<dp n="d8"/>
// fetch alpha values from samplers to input registers t0,t1 and t2
tex t0 // fetch red alpha
tex t1 // fetch green alpha
tex t2 // fetch blue alpha
// combine the alpha values into single vector,
// along the way multiplying these values by
// alpha value of foreground color. This requires
// constant registers c0..c2 to be prepared following way:
// c0.rgba=f.a,0,0,0
// c1.rgba=0,f.a,0,0
// c2.rgba=0,0,f.a,0
// where f.a is foreground alpha.
mad r0,t0.a,c0,c0.a // set red (c0.a replicates 0)
mad r0,t1.a,c1,r0 // set green
mad r0,t2.a,c2,r0 // set blue
// Now r0 contains the alpha vector, referred below as ″x″.
// Calculate the formula r0=x+x*(1-x)*(A*x+B),
// where vectors A and B are prepared in constant
// registers c3 and c4 respectively. Due to typical hardware
// limitation (any value in cn should be in {-1,1} diapason)
// the registers really contain decreased values: c3=A/4 and c4=
B/4.
mad r1,c3,r0,c4 // r1=(A/4)*x+(B/4)
mul_x4 r1,r1,1-r0 // r1=(1-x)*(A*x+B)
mad r0,r0,r1,r0 // r0=x+x*(1-x)*(A*x+B)
// end of pixel shader program.
以下的例子包括用于在多项式系数计算器520处实现过程的C++语言计算机可执行指令。
#include <d3d9.h>
// The definition of the structure used to keep cubic-linear
// gamma correction table.
struct GammaTableRow {float c1,float c2,float c3,float c4};
// Separate instance of GammaTableRow needed for each particular gamma
level;
// it defines following non-linear transformation:
// alpha_corrected=
// alpha+alpha*(1-alpha)*(c1*alpha*f+c2*alpha+c3*f+c4),
// where f is foreground color component.
// The definition of the 4-dimensional vector structure:
struct Vector4d {float r,float g,float b,float a;};
HRESULT PolynomialRatiosCalculator(
const GammaTable* pTable,
int gammaLevel,
const Vector4f& f,//fore color
IDirect3DDeviceg* pD3DDevice
)
<!-- SIPO <DP n="10"> -->
<dp n="d10"/>
// fetch the coefficients row for given gamma level:
const GammaTableRow& coefs=pTable[gammaLevel];
// declare the array of constant registers values:
Vector4d c[5];
// calculate the values of constant registers c0..c2:
c[0].r=f.a;c[0].g= 0;c[0].b= 0;c[0].a=0;
c[1].r= 0;c[1].g=f.a;c[1].b= 0;c[1].a=0;
c[2].r= 0;c[2].g= 0;c[2].b=f.a;c[2].a=0;
// calculate values A and B (see comments to pixel shader program)
// in constant registers c3 and c4:
c[3].r=(coefs.c1*f.r+coefs.c2)/4;
c[3].g=(coefs.c1*f.g+coefs.c2)/4;
c[3].b=(coefs.c1*f.b+coefs.c2)/4;
c[3].a=0;
c[4].r=(coefs.c3*f.r+coefs.c4)/4;
c[4].g=(coefs.c3*f.g+coefs.c4)/4;
c[4].b=(coefs.c3*f.b+coefs.c4)/4;
c[4].a=0;
// now submit prepared data to pixel shader constant registers:
HRESULT hr=pD3DDevice->SetPixelShaderConstantF(0,c,5);
return hr;
应理解,前述例子不包括关于在呈现期间可能被执行的其他操作的描述。特别是,前文没有描述质地准备、输出光栅器调整、关于顶点缓冲器的操作以及在呈现期间可以被执行的其他动作。没有描述这些操作,这是因为它们是以上所提到的Microsoft DirectX_的使用过程中的标准操作。相应地,应理解,本发明的方法、系统和计算机程序产品也可以包括其他呈现操作,这些呈现操作包括(但不局限于)质地准备、输出光栅器调整和顶点缓冲器操作。
总之,本发明在GPU处提供α修正,以补偿γ修正的缺乏。应理解,这可以大大提高呈现字体图示符和其他图像的总速度。虽然为以上所描述的许多例子提供对呈现字体图示符的特殊参考,但是,应理解,本发明也扩展到呈现除字体图示符以外的其他图像。相应地,本发明通过执行α修正以便补偿γ修正的缺乏,可以广泛地扩展到无须γ修正并用所需的方式来呈现任何图像。
操作环境
图6和下文意在简要、概括地描述一种用于执行本发明的某些元件的合适的计算环境。但是,应该强调的是:本发明并不一定局限于任何特定的计算机化系统,并可以在广阔的计算机化系统范围内加以实践。
根据一个实施例,本发明包括存储可以由计算设备来执行的计算机可执行指令(例如,程序模块)的一个或多个计算机可读介质。通常,程序模块包括执行特殊任务或实施特殊的抽象数据类型的例行程序、程序、对象、部件、数据结构等。计算机可执行指令、关联数据结构和程序模块表示用于执行这里所揭示的各种方法的步骤的程序代码方法的例子。这类可执行指令或关联数据结构的特定序列表示用于执行这些步骤中所描述的各项功能的对应的动作的例子。
精通该技术领域的人应理解,除单独的计算设备以外,还可以在具有许多类型的计算机系统配置的网络计算环境(包括个人计算机、手持设备、多处理器系统、基于微处理器的或可编程的消费电子设备、网络PC、小型计算机、大型计算机、它们的部件和类似的环境)中实践本发明。本发明也可以在分布式计算环境中加以实践,在这些分布式计算环境中,由本地处理设备和远程处理设备来执行任务,这些本地处理设备和远程处理设备通过通信网络被连接起来(要么通过硬连线链路、无线链路,要么通过硬连线链路或无线链路的组合)。在分布式计算环境中,程序模块可以位于本地记忆存储器设备和远程记忆存储设备中。
特别参照图6,用于执行本发明的某些元件的示范系统包括采用常规计算机620形式的通用计算系统(包括处理单元621、包含计算机可读介质的系统存储器622,以及将包括系统存储器622的各种系统部件耦合到处理单元621的系统总线623)。系统总线623可以是几种类型的总线结构(包括存储总线或存储控制器、外围总线和使用各种总线构造中的任何总线构造的局域总线)中的任何总线结构。该系统存储器包括只读存储器(ROM)624和随机存取存储器(RAM)625。基本输入/输出系统(BIOS)626可以被存储在ROM 624中,该基本输入/输出系统包含有助于在计算机620内的各个元件之间传送信息(例如,在启动期间)的基本例行程序。
计算机620也可以包括用于从磁性硬盘639读取并对其写入的磁性硬盘驱动器627、用于从可移动磁盘629读取或对其写入的磁盘驱动器628,以及用于从可移动光盘631(例如,CD-ROM或其他光学介质)读取或对其写入的光盘驱动器630。磁性硬盘驱动器627、磁盘驱动器628和光盘驱动器630分别通过硬盘驱动器接口632、磁盘驱动器接口633和光驱接口634被连接到系统总线623。这些驱动器及其关联的计算机可读介质为计算机620提供计算机可执行指令、数据结构、程序模块和其他数据的非易失存储。如上所述,也可以使用这些存储介质来存储使修正系数和γ值相关联的数据结构。虽然这里所描述的示范环境使用磁性硬盘639、可移动磁盘629和可移动光盘631,但是,也可以使用用于存储数据的其他类型的计算机可读介质(包括盒式磁带、快闪存储卡、数字通用盘、伯努里式磁带匣、RAM、ROM和类似的介质)。
包括一个或多个程序模块的程序代码方法可以被存储在硬盘639、磁盘629、光盘631、ROM 624或RAM 625上,包括操作系统635、一个或多个应用程序636、其他程序模块637和程序数据638。用户可以通过键盘640、定点设备642或其他输入设备(未示出)(例如,话筒、操纵杆、游戏垫、圆盘式卫星电视天线、扫描仪或类似的输入设备),将命令和信息输入计算机620。这些和其他的输入设备经常通过被耦合到系统总线623的串行端口接口646而被连接到处理单元621。作为选择,这些输入设备可以由其他接口(例如,并行端口、游戏端口或通用串行总线(USB))来加以连接。监视器647或另一个显示设备也经由诸如视频适配器648的接口被连接到系统总线623。在此上下文中,如上所述,视频适配器648被认为包括GPU。除该监视器以外,个人计算机通常还包括其他外围输出设备(未示出)(例如,扬声器和打印机)。
计算机620可以在使用与一台或多台远程计算机(例如,远程计算机649a和649b)的逻辑连接的联网环境中进行操作。远程计算机649a和649b都可以是另一台个人计算机、服务器、路由器、网络PC、对等设备或其他普通的网络节点,它们通常包括以上相对于计算机620所描述的许多或全部元件,尽管图6中只展示了记忆存储设备650a和650b及其关联的应用程序636a和636b。图6中所描绘的逻辑连接包括局域网(LAN)651和广域网(WAN)652,局域网651和广域网652在这里被举例示出,而不作限制。这类联网环境在办公室范围或企业范围的计算机网络、内联网和因特网中很普遍。
当用于LAN联网环境中时,计算机620通过网络接口或适配器653被连接到局域网651。当用于WAN联网环境中时,计算机20可以包括调制解调器654、无线链路或用于在广域网652(例如,因特网)上建立通信的其他装置。调制解调器654(可能是内置的,也可能是外置的)经由串行端口接口646被连接到系统总线623。在联网环境中,相对于计算机620所描绘的程序模块或其各个部分可以被存储在远程记忆存储设备中。应理解,所示的各种网络连接起示范的作用,可以使用在广域网652上建立通信的其他方法。
应理解,在不脱离本发明的精神或本质特征的前提下,本发明也可以在其他特殊的形式中得到具体表现。无论从哪方面来看,所描述的各个实施例都将被认为只起说明性的作用,而没有限制的作用。所以,本发明的范围由所附权利要求书(而不是由前文)来指明。权利要求书的相等物的含义和范围之内的所有变化都将被包含在该权利要求书的范围以内。