チュートリアル

ENBでLUTを使う

 

※古い記事です。昨今の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

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

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

[COLORCORRECTION]
UsePaletteTexture=true

作業

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

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

 

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

 

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

LUTSelectLayer.png

 

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

LUTTexSave.png

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

再度ゲームを起動して確認します。

ゲーム画面とフォトショップでの色調補正と見た目が同じになりました!

補足

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

応用編 – 昼・夜・室内で分離したLUT – トリプルLUT

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

コードの書き換え

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 https://enbseries.enbdev.com/forum/viewtopic.php?f=7&t=4394
//    Modified by tktk https://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
ダウンロードしたファイルはそれぞれ以下のようになってます。

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を使った色調整をするよ。

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

コメント

  1. tktk より:

    報告ありがとうございます。リンク修正しました。

  2. 名無しさん より:

    ENBの導入解説(tutorial/installenb)で紹介されているENB Manですが、2022/08/21で非公開にされており、以前の公開ページにアクセスできません。
    今のところツールのダウンロードそのものは以下のURLから可能のようです。
    ttps://www.nexusmods.com/skyrim/mods/57620?tab=files&file_id=1000231486
    お手数ですが、紹介内容について見直してもらえると嬉しく思います。