ENBでLUTを使う
ENBにENBパレットの代わりにLUTを実装するチュートリアル。昼夜室内を分離した応用編もあります。

LUT(ルックアップテーブル)を使うと何ができるの?
フォトショップ等での画像編集ソフトで行った色調補正をそのままゲーム上に持ってくることができます!
ENBパレットも似たような機能ですが、精度が良くないので同じ色調補正というわけではありませんでした。

ENB内で複雑なパラメータを追加したり使わなくても直感的にかつ高度な色調補正ができるでしょう。
ただし、あくまで色調補正(カラーグレーディング)なので万能ではありません。ライティングとシャドウがしっかり設定された上で活きる機能なのでよりアートセンスと技術の理解は必要です。

おおまかな作業の流れ
SS撮影→SSとLUTテクスチャを画像編集ソフトで読み込む→一緒に色調補正→LUTテクスチャのみをenbパレットとして保存・配置→ゲーム内に適用される


コードの書き換え
LUTはコードを差し替えればだれでも実装できます。
enbeffect.fxをテキストエディタで開いて、Ctrl+FでPALETTE等を入力し以下のコード部分を検索してください。

#ifdef E_CC_PALETTE
color.rgb=saturate(color.rgb);
float3 brightness=Adaptation.xyz;//tex2D(_s4, 0.5);//adaptation luminance
// brightness=saturate(brightness);//old version from ldr games
brightness=(brightness/(brightness+1.0));//new version
brightness=max(brightness.x, max(brightness.y, brightness.z));//new version
float3 palette;
float4 uvsrc=0.0;
uvsrc.y=brightness.r;
uvsrc.x=color.r;
palette.r=tex2Dlod(_s7, uvsrc).r;
uvsrc.x=color.g;
uvsrc.y=brightness.g;
palette.g=tex2Dlod(_s7, uvsrc).g;
uvsrc.x=color.b;
uvsrc.y=brightness.b;
palette.b=tex2Dlod(_s7, uvsrc).b;
color.rgb=palette.rgb;
#endif //E_CC_PALETTE




上の部分を削除して、以下のように差し替えます。
#ifdef E_CC_PALETTE
float2 CLut_pSize = float2(0.00390625, 0.0625);// 1 / float2(256, 16);
color.rgb = saturate(color.rgb);
color.b *= 15;
float4 CLut_UV = 0;
CLut_UV.w = floor(color.b);
CLut_UV.xy = color.rg * 15 * CLut_pSize + 0.5 * CLut_pSize ;
CLut_UV.x += CLut_UV.w * CLut_pSize.y;
color.rgb = lerp( tex2Dlod(_s7, CLut_UV.xyzz).rgb, tex2Dlod(_s7, CLut_UV.xyzz + float4(CLut_pSize.y, 0, 0, 0)).rgb, color.b - CLut_UV.w);
#endif //E_CC_PALETTE


ファイルを上書き保存します。

下準備
LUTテクスチャをダウンロードします。

Download

Mediafire


ダウンロードしたenbpalette.bmpをスカイリムのフォルダ(ENBと同じフォルダ)に配置します。

ゲーム起動の前にenbseries.iniを開いて、以下の部分をtrueにして保存します。(※ゲーム起動後だと適用されない)
[COLORCORRECTION]
UsePaletteTexture=
true

作業
ゲームを起動して、ENBをオンにした状態でスクリーンショットを撮影します。

フォトショップ、Gimp等の画像編集ソフトでスクリーンショットを開きます。
LUTテクスチャを追加で読み込んで配置します。LUTテクスチャはスクリーンショットと別レイヤーにしておくとあとで便利。
ENBLUTsample.jpg

色調補正(明るさ・コントラストよりレベル補正、トーンカーブ使いましょう)します。
LUTCC.jpg

LUTのレイヤーのサムネイルをCtrl+クリックで描画範囲を選択しておきます。

LUTSelectLayer.png 
色調補正を適用するために画像を統合してから、選択範囲を切り抜きます。

LUTTexSave.png

256x16サイズのテクスチャになるので、これを.BMP形式(24bit)でenbpalette.bmpの名前で保存します。
これをスカイリムのフォルダ(ENBのあるフォルダ)に置きます。

再度ゲームを起動して確認します。
LUTFinish.jpg
ゲーム画面とフォトショップでの色調補正と見た目が同じになりました!

補足
  • UE4/Unityで使われるLUTテクスチャと互換性があります。
  • enbpalette.bmpの変更はゲームを再起動しないと反映されないみたいです。

応用編 - 昼・夜・室内で分離したLUT - トリプルLUT
使ってみるとわかるんですが、LUTの色調補正が昼夜場所問わず一律でかかるので思ったより使いにくい印象です。
そこでenbpalette.bmpを3つ用意して昼・夜・室内で設定を分離します。

3LUT.jpg

コードの書き換え
enbeffect.fxをテキストエディタで開きます。

Ctrl+Fで検索を開いて、"texture2D texs7"等で以下のコード部分を探します。
texture2D texs7;//palette enb

その直下に以下のコードを足してください。

texture2D LutN   <string ResourceName="enbpaletteN.bmp";>;    //palette enb night
texture2D LutI   <string ResourceName="enbpaletteI.bmp";>;    //palette enb Interior


Ctrl+Fで検索を開いて、"sampler2D _s7"等で検索して 以下のコード部分を探します。
sampler2D _s7 = sampler_state
{
    Texture   = <texs7>;
    MinFilter = LINEAR;
    MagFilter = LINEAR;
    MipFilter = NONE;
    AddressU  = Clamp;
    AddressV  = Clamp;
    SRGBTexture=FALSE;
    MaxMipLevel=0;
    MipMapLodBias=0;
};

その直下に以下のコードを足してください。

sampler2D _LutN = sampler_state
{
    Texture   = <LutN>;
    MinFilter = LINEAR;
    MagFilter = LINEAR;
    MipFilter = NONE;
    AddressU  = Clamp;
    AddressV  = Clamp;
    SRGBTexture=FALSE;
    MaxMipLevel=0;
    MipMapLodBias=0;
};


sampler2D _LutI = sampler_state
{
    Texture   = <LutI>;
    MinFilter = LINEAR;
    MagFilter = LINEAR;
    MipFilter = NONE;
    AddressU  = Clamp;
    AddressV  = Clamp;
    SRGBTexture=FALSE;
    MaxMipLevel=0;
    MipMapLodBias=0;
};



あとは通常版と同じようにCtrl+FでPALETTE等を入力し以下のコード部分を検索してください。
#ifdef E_CC_PALETTE

省略(上のコードの書き換え参照)

#endif //E_CC_PALETTE

上の部分を削除して、以下のように差し替えます。

//    Original Code by kingeric1992 http://enbseries.enbdev.com/forum/viewtopic.php?f=7&t=4394
//    Modified by tktk http://skyrimshot.blog.fc2.com/blog-entry-78.html
#ifdef E_CC_PALETTE
float2 CLut_pSize = float2(0.00390625, 0.0625);// 1 / float2(256, 16);
color.rgb  = saturate(color.rgb);
color.b   *= 15;
float4 CLut_UV = 0;
CLut_UV.w  = floor(color.b);
CLut_UV.xy = color.rg * 15 * CLut_pSize + 0.5 * CLut_pSize ;
CLut_UV.x += CLut_UV.w * CLut_pSize.y;

float3 LUTD;
float3 LUTD2;
float3 LUTN;
float3 LUTN2;
float3 LUTI;
float3 LUTI2;
float3 LUTA;
float3 LUTA2;

LUTD.rgb = tex2Dlod(_s7, CLut_UV.xyzz).rgb;
LUTD2.rgb = tex2Dlod(_s7, CLut_UV.xyzz + float4(CLut_pSize.y, 0, 0, 0)).rgb;
LUTN.rgb = tex2Dlod(_LutN, CLut_UV.xyzz).rgb;
LUTN2.rgb = tex2Dlod(_LutN, CLut_UV.xyzz + float4(CLut_pSize.y, 0, 0, 0)).rgb;
LUTI.rgb = tex2Dlod(_LutI, CLut_UV.xyzz).rgb;
LUTI2.rgb = tex2Dlod(_LutI, CLut_UV.xyzz + float4(CLut_pSize.y, 0, 0, 0)).rgb;
LUTA.rgb = lerp(lerp(LUTN.rgb, LUTD.rgb, ENightDayFactor), LUTI.rgb, EInteriorFactor);
LUTA2.rgb = lerp(lerp(LUTN2.rgb, LUTD2.rgb, ENightDayFactor), LUTI2.rgb, EInteriorFactor);

color.rgb  = lerp( LUTA.rgb, LUTA2.rgb, color.b - CLut_UV.w);
#endif //E_CC_PALETTE

あとは上書き保存すればコードの書き換えは終了です。

下準備
LUTテクスチャをダウンロードします。
LUT3TexturesSample (3つ入り)

Download

Mediafire

ダウンロードしたファイルはそれぞれ以下のようになってます。
enbpalette.bmp = 昼(Day)
enbpaletteN.bmp = 夜(Night)
enbpalettteI.bmp = 室内(Interior)
上の3つのファイルをスカイリムのフォルダ(ENBと同じフォルダ)に配置します。

ゲーム起動の前にenbseries.iniを開いて、以下の部分をtrueにして保存します。(※ゲーム起動後だと適用されない)
[COLORCORRECTION]
UsePaletteTexture=
true

色調補正の使い方は通常版と一緒ですが、日の出と日の入りは昼と夜の設定のブレンドなので時間帯に気をつけましょう。


参考
[HLSL CODE] 3D LUT オリジナルです。kingeric1992さんに感謝!
UE4ドキュメント
UE4でLUTを使った色調整をするよ。

関連記事
コメントの投稿


Does not accept comments that are all written in English on this blog for blocking a spam. If you have any questions, send a e-mail: tktk11111[at]gmail.com

コメント