DirectX 11 Win7与Win8在亮度/着色器环境光线方面的差异

时间:2013-11-19 15:26:05

标签: wpf winforms directx directx-11

问题出现在所有Win8系统,所有品牌,所有类型的台式机,笔记本电脑,多功能一体机和平板电脑上(几乎在BestBuy的每个系统都进行了测试,其中有很多,所以我不能第一个看到这个的人。)

正在发生的事情如下图所示(注意每个表面下方的标题),其中Win8上的渲染比本机代码的Win7和基于窗口ID3D11Device / Context的WinForm更亮;并使事情变得更糟;虽然使用类似的设备/上下文,但是通过WPF和WPF共享表面/纹理特征,渲染更暗。实际的渲染循环和着色器是相同的。 Win7 / Vista通过本机类型渲染目标或WPF共享表面渲染相同/理想的亮度。

DirectX 11代码是在Win7上开发的。这是非常基本的DX东西,着色器尽可能简单的着色器;与最基本的DirectX SDK示例非常相似。

  1. 为什么DX11 Win8的亮度与Win7不一致?渐变似乎也不同。

  2. 为什么Win8 WPF共享表面/纹理会产生更大的差异?

  3. 解决此类渲染亮度差异的最佳策略是什么?

  4. enter image description here

    我最终回答了,但欢迎改进或扩展win7和win8之间的亮度/照明问题的相关答案,因为在网上搜索这样的主题几乎没有结果。

2 个答案:

答案 0 :(得分:0)

经过我和MS之间的大量工作后,(MS想要一个没有使用DXUT的复制品,即使我告诉他们PNTriangles11引起了这个问题并且这是一个疯狂的追逐。)我发现这与EnumOutputs在Win8上失败有关(MS仍然提供官方原因,我会更新)和调用EnumOutputs失败的DXUT部分导致代码段DXUTApplyDefaultDeviceSettings(DXUTDeviceSettings * modifySettings)出现问题

其中......

 modifySettings->d3d11.sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM_SRGB;

应改为......

 modifySettings->d3d11.sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; 

解决了问题,Win7和Win8之间的颜色一致。 MS指出了这一点。虽然我想知道为什么EnumOutputs在Win8上出现故障,MS可能是唯一可以回答这个问题的人。所有类型的系统都在BestBuy的每个Win8系统上都失败了EnumOutputs。

对于Win8兼容性所需的另一个DXUT修改,在DXUTChangeDevice中,可能需要为非零的hAdapterMonitor添加测试......

bool bNeedToResize = false;
if(hAdapterMonitor && DXUTGetIsWindowedFromDS( pNewDeviceSettings ) && !bKeepCurrentWindowSize ) 
{
    UINT nClientWidth;
    UINT nClientHeight;
    if( ::IsIconic( DXUTGetHWNDDeviceWindowed() ) )

为了与主题标题相关的完整性,可以在directx gamma correction找到伽马校正信息,并为集成显示器win8 brightness control

创建新的Windows 8亮度控制功能

答案 1 :(得分:0)

我目前正在Windows 8上测试我的C ++,DX10程序(基于2010年6月的DXUT), 而且我遇到了同样的问题。

以下是我建议在DXUT上进行的其他更改/建议:

1)不要在DXUTInit的strExtraCommandLineParams中使用参数/ width,/ height,/ windowed / / fullscreen

2)在DXUTGetMonitorInfo中,s_pFnGetMonitorInfo(hMonitor,lpMonitorInfo);在我的系统上返回FAIL。 所以我用以下内容替换了这一行:

BOOL success = s_pFnGetMonitorInfo( hMonitor, lpMonitorInfo );
//try to return the less wrong result
if ( !success )
{
RECT rcWork;
if ( lpMonitorInfo && 
 ( lpMonitorInfo->cbSize >= sizeof( MONITORINFO ) ) &&
 SystemParametersInfoA( SPI_GETWORKAREA, 0, &rcWork, 0 ) 
 )
{
  lpMonitorInfo->rcMonitor.left = 0;
  lpMonitorInfo->rcMonitor.top = 0;
  lpMonitorInfo->rcMonitor.right = GetSystemMetrics( SM_CXSCREEN );
  lpMonitorInfo->rcMonitor.bottom = GetSystemMetrics( SM_CYSCREEN );
  lpMonitorInfo->rcWork = rcWork;
  lpMonitorInfo->dwFlags = MONITORINFOF_PRIMARY;
  return TRUE;
}
  return FALSE;
}
else
{
  return TRUE;
}

3)关于亮度(伽马校正), 如果已添加:

if ( BackBufferFormat == DXGI_FORMAT_R8G8B8A8_UNORM_SRGB )
{
   return false;
}

在我的回调IsD3D10DeviceAcceptable中,所以我禁止每个伽马校正设备。

现在一切似乎都有效了

(顺便说一句,我不确定你的" hAdapterMonitor&&"修改,因为它没有直接使用这个指针,但也许我们不会' t具有相同的DXUT版本)