基于DirectDraw的Gamma calibrator机制之探讨

本文探讨基于DirectDraw的Gamma calibrator机制。介绍了其基于动态gamma ramp技术的应用需求,对比了DirectDraw接口与Win32 API函数的差异。分析了DirectDraw调用calibrator的机制,还给出测试程序实现,最后指出当前机制是猜测,存在不足且未来会改变。

基于DirectDraw的Gamma calibrator机制之探讨


一.问题的提出

Gamma calibrator基于动态gamma ramp技术。为系统提供动态gamma ramp支持,基于以下应用的需要:
1. 游戏程序的设计者可以为用户提供一致的视觉效果,而不论用户使用什么系统。
2. 随着电子商务的迅猛发展,商家和用户都迫切需要在Internet上看到货物样品的真实色彩。
3. 谁都希望,显示器上图像的色彩尽可能地和输出的色彩相近。

基于以上需要,具有Microsoft Windows Logo的硬件产品都需要提供动态gamma ramp支持(参见"Adapter supports downloadable RAMDAC entries for image color matching",网址: www.microsoft.com/hwdev/xpapers/pc98/14grfx98.htm)。只要显示卡及其驱动程序支持动态gamma ramp,buffer frame中所有象素的RGB值就可以被校正值取代。

为了在Windows95, Windows98和Windows2000中支持动态gamma ramp,DirectDraw中提供了IDirectDrawGammaControl接口。此接口允许程序设计者处理gamma ramp,使得象素的RGB值在被送到DAC显示之前得到校正。

本来,Win32 API中有两个函数(即SetDeviceGammaRamp/GetDeviceGammaRamp)可以用来获取和设置gamma ramp。但它们较之DirectDraw接口有以下局限:
1. SetDeviceGammaRamp不允许设置所有可能的gamma ramp值。它会检查gamma ramp,如果太复杂会拒绝执行。
2. SetDeviceGammaRamp目前不支持gamma calibrator。
3. 调用SetDeviceGammaRamp的程序关闭后不会自动进行清理操作,除非将gamma ramp恢复到设置前的值。

与以上第二点相反,除了可以获取和设置gamma ramp外,DirectDraw接口允许gamma ramp被校正(calibrated),这就需要安装一个gamma calibrator。


二.分析

据我所知,到目前为止,DirectDraw注册和使用Gamma calibrator的机制尚未最终确定,只有一个过渡方案。此方案只用短短一句话进行了描述:calibrator在系统注册表中的某个key中注册自身;当应用程序需要校正gamma ramp的时候,DirectDraw调用这个calibrator。

至于具体实现细节,到目前我没发现任何文档。

基于此,我对DirectDraw调用calibrator的机制进行了分析和猜测,发现如下:

1)Calibrator中必须实现一个名为CalibrateGammaRamp的输出函数,Gamma calibration的操作即在此函数中实现。
2)Calibrator必须将自身所在的安装路径注册在系统注册表的如下key中:
  HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/DirectDraw/GammaClibrator
3)客户程序通过调用IDirectDrawGammaControl::SetGammaRamp来间接触发calibrator。
SetGammaRamp的原型为:
  HRESULT SetGammaRamp(DWORD dwFlags, LPGAMMARAMP lpRampData)
DwFlag表示是否需要进行gamma calibration。若这个参数设为DDSGR_CALIBRATE,系统将会请求calibrator来调整gamma ramp,从而达到校正显示效果的目的。若不需要校正,将这个参数设为0。LpRampData是DDGAMMARAMP结构的地址,此结构包含R,G,B三色素的gamma ramp值。
设置dwFlags参数为DDSGR_CALIBRATE并调用SetGammaRamp后,DirectDraw会自动根据calibrator的注册信息找到calibrator的路径,并调用calibrator的CalibrateGammaRamp输出函数,从而实现gamma calibration。

三.实现

我写了两段测试程序来检验Gamma calibrator的实现机制。calibrator.cpp编译链接后生成calibrator.dll, 即gamma calibrator程序;test.cpp则生成test.exe,即客户程序,它调用calibrator。

1. calibrator
calibrator本身的结构很简单,它只需要实现三个函数(甚至一个,即CalibrateGammaRamp,其它两个可以在安装程序中或手工实现)。
1)CalibrateGammaRamp输出函数。其声明如下:
 extern "C" __declspec(dllexport) HRESULT CalibrateGammaRamp(D3DGAMMARAMP* pRamp)
其中输入参数pRamp为当前的gamma ramp值(也即,客户程序调用SetGammaRamp时设置的值)。出于测试的目的,在我的calibrator中没有利用这个初始值,而是重新设置了gamma ramp,并夸张地将所有的R(Red)值设置为0,以方便地看到测试效果。

 HDC hDC = ::GetDC(NULL);
 if (!hDC)
  return E_FAIL;

 WORD RamdacTable[3*256];

 GetDeviceGammaRamp(hDC, RamdacTable);

 for (int i = 0; i < 3; ++i)
  for (int j = 0; j < 256; ++j)
   if ( i == 0)
    RamdacTable[i] = 0;
   else
    RamdacTable[i*256+j] = j*256;

 if(!SetDeviceGammaRamp( hDC, RamdacTable))
 {
  BOOL bReason = GetLastError();
  ::MessageBox(NULL, "SetDeviceGampRamp failed!", "Error", NULL);
 }

 ::ReleaseDC(NULL, hDC);

2)为了让DLL可以register和unregister自己的安装路径,输出两个函数DllRegisterServer和DllUnregisterServer,以供regsvr32程序调用。这两个函数的实现和COM DLL中的写法一致,这里不再赘述。注意信息要注册到HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/DirectDraw/GammaClibrator键之下。


2. 客户程序

客户程序必须支持DirectDraw,才能调用calibrator。
1)首先,创建一个Direct3D object:
    LPDIRECT3D8 g_pD3D;
 g_pD3D = ::Direct3DCreate8(D3D_SDK_VERSION)
2)获得当前显示模式:
 D3DDISPLAYMODE d3ddm;
 g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm)
3)创建Direct3D device:
 LPDIRECT3DDEVICE8       g_pd3dDevice = NULL;
 g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,
    D3DDEVTYPE_HAL,
    hWnd,
    D3DCREATE_SOFTWARE_VERTEXPROCESSING,
    &d3dpp,
    &g_pd3dDevice )
4)检测设备是否支持gamma calibration:
 D3DCAPS8 d3dcap;
 if( FAILED( g_pd3dDevice->GetDeviceCaps( &d3dcap ) ) )
 {
  ::MessageBox(NULL, "GetDeviceCaps", "Failed", NULL); 
  return E_FAIL;
 }
 if( !( d3dcap.Caps2 & D3DCAPS2_CANCALIBRATEGAMMA ) )
 {
  ::MessageBox(NULL, "Your machine doesn't support gamma Calibrator", "Warnning", NULL);
  return E_FAIL;
 }
5)设置gamma ramp:
 D3DGAMMARAMP d3dgamaramp;
 ... // 初始化d3dgamaramp

 // 设置gamma ramp,同时请求calibration
 g_pd3dDevice->SetGammaRamp( D3DSGR_CALIBRATE , &d3dgamaramp);


四.结论
由于没看到M$关于gamma calibration的正式文档,以上机制纯属自己的猜测。测试程序虽能work,但终究只是猜测,不知尚有多少规范没有实现。而且,在win2000下,DirectDraw对gamma calibration的支持似乎不够。再者,M$声称,目前DirectDraw和gamma calibrator的通信机制以及calibrator注册自身的方法只是一个过渡方案,将来会改变。鉴于以上原因,特写此文,以请对gamma calibration有研究者不吝赐教。

内容概要:本文介绍了一个基于Simulink的混合储能驱动永磁同步电机全系统仿真模型,涵盖了系统整体架构与关键控制策略,重点实现了电流环的二阶滑模控制(STSMC)、有限集模型预测控制(FCS-MPC)PI控制等多种先进控制方法。该模型集成了混合储能系统与永磁同步电机驱动系统,能够模拟复杂工况下的动态响应、能量管理过程及多变量耦合特性,适用于高性能电机控制系统的设计、分析与验证,尤其在新能源汽车、电动驱动系统工业自动化等领域具有重要应用价值。; 适合人群:具备Simulink仿真基础、电力电子与电机控制背景的高校研究生、科研人员及自动化、电气工程领域的研发工程师。; 使用场景及目标:①用于研究对比不同电流控制策略(如STSMC、FCS-MPC、PI)在永磁同步电机系统中的动态性能、鲁棒性与抗干扰能力;②支撑混合储能系统在电动驱动、新能源汽车、智能电网等领域的系统级仿真与优化设计;③为先进控制算法的开发与工程化落地提供高保真、模块化的仿真平台。; 阅读建议:建议结合Simulink模型与相关控制理论进行对照学习,重点关注各功能模块之间的信号交互、控制逻辑设计及参数整定方法,可通过修改负载条件、切换控制模式等方式开展对比实验,深入理解系统动态行为与控制效果差异。
软件概述 UG(Unigraphics NX)是一款由西门子(Siemens PLM Software)开发的交互式CAD/CAM/CAE系统。作为全球领先的产品工程解决方案,它集成了产品设计、工程仿真与制造加工于一体。其功能强大且应用广泛,能够轻松实现各种复杂实体造型的构造,为模具、汽车、航空航天及通用机械等行业提供了高性能的机械设计与制图灵活性。 软件基础信息 • 支持系统: 64位 Windows 10、Windows 11 核心功能模块 一、创新设计:高效、灵活、无缝协同 全链路产品设计 涵盖从2D布局、3D建模、装配设计到图纸文档记录的各个环节,大幅提升设计吞吐量,缩短交付周期超35%。 强大的同步建模技术 打破数据壁垒,可无缝导入并直接修改来自其他CAD系统的几何模型,是跨平台协同设计的理想选择。 复杂装配管理 专为大型复杂产品打造,即使面对成千上万的零件也能从容应对,快速识别并解决数字样机中的干涉等问题。 集成设计验证 内置自动验证功能,实时监控设计是否符合公司及行业标准;结合PLM数据可视化合成,辅助工程师做出更明智的决策。 二、综合仿真(Simcenter 3D):精准预测,降低试错成本 极速前后处理 依托先进的几何引擎,将强大的分析命令与几何编辑紧密集成,相比传统有限元工具,可缩短高达70%的仿真建模时间。 全方位结构分析 在同一环境中集成线性静力学、动态、疲劳及非线性分析,底层由业界顶尖的NX Nastran解算器提供支持,确保计算的高精度与可靠性。 声学与热管理分析 提供内外声学仿真以优化音质、降低噪音;具备一流的热传导仿真能力,帮助电子产品工业机械实现最佳热管理方案。 多物理场耦合 简化了结构动力学、热传导、流体流动等复杂物理现象的模拟过程,消除外部数据传输错误,真实还原产品运行工况。 三、智能制造(CAM):打通从计划到车间的数字主线 全面的制造解决方案 提供从工装设计、CAM编程到机床控制器(如Sinumerik)的一体化支持,助力制定更科学的生产决策。 深度集成的PLM环境 借助Teamcenter实现数据流程的统一管理,避免多数据库冲突,支持重用验证过的加工工艺与刀具库。 车间级互联 通过DNC系统与车间无缝对接,直接将加工数据刀具清单下发至CNC机床,实现计划与生产的紧密结合。 提质增效 优化NC编程与刀具路径,提升表面精加工水平与零件精度;减少人为错误,显著提高新机床部署成功率及制造资源利用率。 总结 UG NX 2023作为一款集成化的产品工程解决方案,通过其强大的设计、仿真制造功能,为现代制造业提供了完整的数字化产品开发平台。无论是复杂产品的设计验证,还是精密制造的流程优化,UG NX 2023都能为工程师团队提供高效、可靠的解决方案,助力企业提升产品创新能力市场竞争力。 适用领域 模具设计、汽车制造、航空航天、通用机械、消费电子等
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值