(Unity2018.2, VS2017現在)
UnityとVisual Studioで開発してるそこのあなた、
シェーダー書いてますよね。
なんかC#書いてるときより苦しいですよね。
少し楽になれる方法教えます。
- VSのプラグインの紹介
- それだけじゃダメなところを紹介
- ダメなところを改善
- さらに改善
HLSL Tools for Visual Studio
HLSLだと補完効いたりしてなんかVisual Studioっぽい感じになって嬉しいやつです。
けどShaderLabの拡張子って .shader
じゃん、使えないやんけ!
鋭い方々はこう思うかもしれません。
.shader
拡張子にもHLSL Toolsを反応させることもできますが、HLSLじゃないShaderLabの部分に反応して不快です。
HLSLじゃないならHLSLにしてしまえ
そうするのではなく、以下のようなコードを書けば快適になります。
Shader "Hidden/Hoge"
{
SubShader
{
Pass
{
HLSLPROGRAM
#pragma vertex VertDefault
#pragma fragment Frag
#include "hoge.hlsl"
ENDHLSL
}
}
#include "PostProcessing/Shaders/StdLib.hlsl"
TEXTURE2D_SAMPLER2D(_MainTex, sampler_MainTex);
half4 Frag(VaryingsDefault i) : SV_Target
{
float2 uv = i.texcoord;
// Source color
half4 color = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, uv);
half3 luminance = dot(color.rgb, half3(0.2126729, 0.7151522, 0.0721750));
color.rgb = luminance;
return color;
}
こうすることでロジックのほとんどをHLSLにまとめてHLSL Toolsの恩恵に授かれます。
ちなみにこの開発スタイルはUnityのKeijiro Takahashiさんを参考にしています。
しかし!これだけだと #include "PostProcessing/Shaders/StdLib.hlsl"
で「こんなファイル知らんぞ」って怒られます。
Unityが見ているパスと、HLSL Tools for Visual Studioが見ているパスは違うのでHLSL ToolsにPostProcessing Stackのパスを教えてあげないといけません。
shadertoolsconfig.jsonを使ってHLSL ToolsでもUnityのデフォルトシェーダーをincludeする
HLSL Tools for Visual Studioはshadertoolsconfig.json
というファイルを現在開いているファイルのパスの親をたどりながら探します。
なので、Unityプロジェクトのルートディレクトリに shadertoolsconfig.json
を入れておくとそこを基準にたどってくれます。
Assetsとかがあるパスと同じところです。
Unityはデフォルトで Unity/Editor/Data/CGIncludes
というパスからシェーダーをいくつかインポートしています。そこでUNITY_MATRIX_MVPなどのマクロが入っていたりします。(ここに全部載ってます)
また、最近のUnity(5以来久々に触ったのが2018.2なのでいつ入ったかわからないのですが)はなんかPackage Managerとかいう機能が入っていて、PostProcessing Stackはそれを使ってプロジェクトに取り込みます。そうすると、Assets/
配下ではなくProjectウィンドウの下のほうに生えたPackagesとかいうところに居ますが、プロジェクトのどこを探しても見つからないです。
PackageはC:\Users\%username%\AppData\Local\Unity\cache\packages\
に置かれる模様です。なのでPostProcessing Stackのシェーダーを使いたい場合はそのパッケージまでのパスを通してあげないといけません。
最終的にはこんな感じになります:
{
"hlsl.additionalIncludeDirectories": [
".",
"C:\\Users\\spaghet\\AppData\\Local\\Unity\\cache\\packages\\packages.unity.com\\com.unity.postprocessing@2.0.10-preview",
"C:\\Program Files\\Unity\\Hub\\Editor\\2018.2.2f1\\Editor\\Data\\CGIncludes"
]
}
shadertoolsconfig.json
について詳しくは このissueとドキュメントを読んでみてください。
Issueにも書いてある通りShaderLab対応も実装中らしいのでこの記事はそろそろDeprecatedされるかと思います(笑)
これでかなり快適になったかと思います。
いかがでしょうか?