【Unity】【シェーダ】なんとなく書きがちな#pragma target 3.0の意味

Unityでシェーダを書くとき、特定の機能を使う場合に次のような記述をすることがあるとおもいます。

#pragma target 3.0

これはShader Compilation Target Levelsというものです。
今回はこれについて調べてみます。

Shader Compilation Target Levels

まずマニュアルを読んでみます。

Unity - Manual: Shader Compilation Target Levels

これによると、たとえば#pragma target 2.0の説明は次のように記述されています。

Works on all platforms supported by Unity. DX9 shader model 2.0.

Shader Modelでいうところの2.0相当とのこと。
どうやらShader Modelってものと対比できるようです。

そしてだいたいShader Compilation Target Levelsとそれに対応するShader Modelの数字は同じものとなるみたい。

Shader Model

それではShader Modelとはなんなのか。

Weblio辞書によると

Direct3D対応ハードウェア(グラフィックスカード)の世代によって、GPU上にてハードウェアレベルで実行可能なシェーダープログラムの仕様(制約、機能など)が異なる。この仕様はシェーダーモデルと呼ばれ ...

とのこと。
Shader ModelはDirectXの概念で、低ければ使える機能が少ないし、高ければ使える機能が多いということ。

OpenGL ESでいうと?

Shader ModelというのはDirectXの概念なので、モバイル端末で多いOpenGL ESには無い概念です。

OpenGL does not follow the Direct3D Shader Model format
Detecting the Shader Model より

となるとあるOpenGL ESのバージョンと対応するShader Modelは何なのか?ということが知りたくなりますが、
コレ!と明言できない、というのが答えのようです。

Note that you can’t always find an exact match for each version in the other API...
Shader Model and GLSL versions | RenderingPipeline より

どうすればいいの?

「明言できない」のはわかったけどじゃあどうすればいいのか?

まず下記のフォーラムによると、大体のモバイル端末ではShader Model 3.0までは動くようです。
ダメなのは一部のOpenGL ES 2.0端末とのこと。

https://forum.unity.com/threads/is-it-ok-to-use-pragma-target-3-0-in-shader-for-mobile-game.448547/

そして3.0ってのは結構な機能が使えます(主観)。
それよりも高いShader Modelについて調べたければ、マニュアルを読むのがよさそうです。

Unity - Manual: Shader Compilation Target Levels

各Target Levelで使えるもの、対応するAPIのバージョンについて詳しく記述されています。

参考サイト

Unity - Manual: Shader Compilation Target Levels

Detecting the Shader Model - OpenGL Wiki

Shader Model and GLSL versions | RenderingPipeline