Windows Auto HDRの実装方法

基本的には、下記ブログの内容の要約です。

AutoHDR対応するための技術的要件

ゲームがDirectX 11またはDirectX 12を使用していること

最初に

本記事の作者はUnityを触った事すらありません!(重要です!)

C#
// C# Windows Auto HDR implementation sample

using System;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Interop;

namespace WindowsAutoHDR
{
    public partial class MainWindow : Window
    {
        // Win32 API constants and structures
        private const int WM_APPCOMMAND = 0x0319;
        private const int APPCOMMAND_ENABLE_HDR = 0x0000001E;

        [StructLayout(LayoutKind.Sequential)]
        private struct APPCOMMAND_HDR
        {
            public IntPtr hwnd;
            public uint cbSize;
            public int dwFlags;
        }

        [DllImport("user32.dll")]
        private static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);

        public MainWindow()
        {
            InitializeComponent();
        }

        private void EnableHDRButton_Click(object sender, RoutedEventArgs e)
        {
            // Get the window handle
            var window = new WindowInteropHelper(this);
            var hwnd = window.Handle;

            // Create the APPCOMMAND_HDR structure
            var hdr = new APPCOMMAND_HDR();
            hdr.hwnd = hwnd;
            hdr.cbSize = (uint)Marshal.SizeOf(hdr);
            hdr.dwFlags = 1; // 1: enable HDR, 0: disable HDR

            // Marshal the structure to a pointer
            var ptr = Marshal.AllocHGlobal(Marshal.SizeOf(hdr));
            Marshal.StructureToPtr(hdr, ptr, false);

            // Send the WM_APPCOMMAND message with the APPCOMMAND_ENABLE_HDR command
            SendMessage(hwnd, WM_APPCOMMAND, IntPtr.Zero, ptr);

            // Free the pointer
            Marshal.FreeHGlobal(ptr);
        }
    }
}

やたら、NIKKEがHDR対応しているって言ってるけど違うよね?

はい。ごめんなさい。おっしゃる通りでございます。
今回のHDRはWindowsによるSDR画像をHDRに自動アップグレードする機能です。

Microsoftが頑張ってるよね?Shift-UP頑張ってないよね?

この内容をEnjinia向けに書くか迷いましたが、テスト工数!

コメント

タイトルとURLをコピーしました