问题出现在所有Win8系统,所有品牌,所有类型的台式机,笔记本电脑,多功能一体机和平板电脑上(几乎在BestBuy的每个系统都进行了测试,其中有很多,所以我不能第一个看到这个的人。)
正在发生的事情如下图所示(注意每个表面下方的标题),其中Win8上的渲染比本机代码的Win7和基于窗口ID3D11Device / Context的WinForm更亮;并使事情变得更糟;虽然使用类似的设备/上下文,但是通过WPF和WPF共享表面/纹理特征,渲染更暗。实际的渲染循环和着色器是相同的。 Win7 / Vista通过本机类型渲染目标或WPF共享表面渲染相同/理想的亮度。
DirectX 11代码是在Win7上开发的。这是非常基本的DX东西,着色器尽可能简单的着色器;与最基本的DirectX SDK示例非常相似。
为什么DX11 Win8的亮度与Win7不一致?渐变似乎也不同。
为什么Win8 WPF共享表面/纹理会产生更大的差异?
解决此类渲染亮度差异的最佳策略是什么?
我最终回答了,但欢迎改进或扩展win7和win8之间的亮度/照明问题的相关答案,因为在网上搜索这样的主题几乎没有结果。
答案 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版本)