2017-05-15 29 views
1

DirectX C++ Windowsアプリケーションで10ビットカラーのサポートを追加したいとします。 DXGI_FORMAT_R10G10B10A2_UNORMを使用して、RGBチャンネルあたり10ビット(RGBの合計30ビット)について話しています。ディスプレイ上の10ビットカラーサポートを検出する

システムがそれをサポートしているかどうかを検出する方法は、ディスプレイモニタが実際にこのモードをサポートしているかどうかです。

例えば、私は、表示モードのリストを列挙していますので:

IDXGIOutput *output=null; for(Int i=0; OK(adapter->EnumOutputs(i, &output)); i++) 
    { 
    DXGI_FORMAT mode=DXGI_FORMAT_R10G10B10A2_UNORM; 
    UInt descs_elms=0; output->GetDisplayModeList(mode, 0, &descs_elms, null); // get number of mode descs 
    RELEASE(output); 
    } 

そして、私のノートパソコンのディスプレイが10ビットをサポートしていないにもかかわらず、私はまだ解像度のリストを含む、有効な結果を取得。 後で10ビットのフルスクリーンスワップチェーンを作成でき、すべて正常に動作します。

しかし、モニターが10ビットか8ビットかわからないので、10ビットをシミュレートするためにいくつかのディザリングを手動で適用する必要があるかどうかはわかりません。

ディスプレイが実際に10ビット=ディザリングが必要ない場合、または8ビット=であればカスタムディザリングシェーダを適用します。

私は古典的なWin32/WinAPIと新しいユニバーサルWindowsプラットフォームの両方で作業しています(したがって、両方のプラットフォームのソリューションが必要です)。モニターが本当には、10ビット・モードをサポートしているかどうかを考え出す

答えて

0

10ビットモデルのの多くは実際には8ビット+ディザ(および8ビットのモデルの多くはちょうど6であるため、非常にトリッキーなことのようですビット+ディザ)。このようなチェックに精通しているソフトウェアの中には、ディスプレイモデルのホワイトリストを通じて実装されたものがあります。ですから、DXGI_FORMAT_R16G16B16A16_FLOAT(これはおそらくほとんどのアダプタでサポートされています)またはDXGI_FORMAT_R32G32B32A32_FLOATを出力形式として使用し、ディスプレイの期待通りにシステムに変換させる方が良いと思います。カスタムディザリングは、ユーザーにとってはオプションとして残すことができます。

1

ディザリングをオン/オフし、スワップチェーンにDXGI_FORMAT_R10G10B10A2_UNORMを使用するだけのユーザー設定がある方が良いでしょう。

DXGI_FORMAT_R10G10B10A2_UNORMも有効なHDRフォーマットですが、ST.2084カラーカーブを手動で適用し、広域(すなわちHDR10)の使用を示すために適切に色空間を設定する必要があります。 DXGI_FORMAT_R16G16B16A16_FLOATを使用してリニアカラースペースでレンダリングすることもできますが、それをシステムに任せて、あなたの期待に合っているかもしれないし、そうでないかもしれない「正しい」ことをしています。 DWMは、8ビットにあなたを変換しているので、

非HDR/4kUHDのシナリオでは、あなたが本当にとにかくウィンドウモードまたはUWP CoreWindows swapchains付き8ビット以上のものを得ることができません。 Win32の「古典的な」デスクトップアプリケーションのための10ビットスキャンアウトは排他的なフルスクリーンモードで可能ですが、多くの変数があります(例えば、DVIケーブルはそれをサポートしていません)。

High Dynamic Range and Wide Color Gamutを参照してください、だけでなく、D3D12HDRサンプルWin32/UWP

+0

こんにちはチャック、ご返信いただき、誠にありがとうございます。これは私が現在やっていることです。現在のところ、これはユーザー設定を持つことで最高のソリューションです。 しかし、これにはいくつかの欠点があります。ユーザーには、これを自動検出するのではなく、何かを設定する必要があるという不便さがあります。また、ユーザーが自分のモニターがサポートしているものを単に知ることができず、悪化する品質。 例えば、彼は10ビットの精度を選択し、8ビットよりも優れた品質を得ると考えています。 – Esenthel

+0

実際には10ビットの設定では、ディザシェーダは無効になり、モニタが8ビットの場合、ディザリングシェイダなしではさらに悪くなります。 そのユーザー設定では、このオプションが何をするのか、本当に明確にする必要があります。 DirectXが実際にサポートされているものとされていないものを検出するためのオプションを提供した場合、最も良い方法です。私はその新しい機能が将来追加されることを要求したいと思います。 BTW。これは私のゲームエンジンです、今、数年間の開発http://www.esenthel.com/ ありがとう – Esenthel

関連する問題