LoginSignup
28
28

More than 5 years have passed since last update.

HLSL Tools for Visual Studioで快適なUnityシェーダー開発をしていく

Last updated at Posted at 2018-08-14

(Unity2018.2, VS2017現在)

UnityとVisual Studioで開発してるそこのあなた、
シェーダー書いてますよね。
なんかC#書いてるときより苦しいですよね。
少し楽になれる方法教えます。

  1. VSのプラグインの紹介
  2. それだけじゃダメなところを紹介
  3. ダメなところを改善
  4. さらに改善

HLSL Tools for Visual Studio

HLSL Tools for Visual Studio

gif

HLSLだと補完効いたりしてなんかVisual Studioっぽい感じになって嬉しいやつです。

けどShaderLabの拡張子って .shaderじゃん、使えないやんけ!

鋭い方々はこう思うかもしれません。
.shader拡張子にもHLSL Toolsを反応させることもできますが、HLSLじゃないShaderLabの部分に反応して不快です。

HLSLじゃないならHLSLにしてしまえ

そうするのではなく、以下のようなコードを書けば快適になります。

hoge.shader

Shader "Hidden/Hoge"
{
    SubShader
    {

        Pass
        {
            HLSLPROGRAM
            #pragma vertex VertDefault
            #pragma fragment Frag
            #include "hoge.hlsl"
            ENDHLSL
        }
    }
hoge.hlsl
#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のシェーダーを使いたい場合はそのパッケージまでのパスを通してあげないといけません。
最終的にはこんな感じになります:

shadertoolsconfig.json
{
  "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されるかと思います(笑)

これでかなり快適になったかと思います。
いかがでしょうか?

28
28
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28
28