Unity のシェーダーは、次の 3 つの方法のいずれかで記述できます。
シェーダーが照明や影の影響を受ける場合は、サーフェスシェーダーが最適です。サーフェスシェーダーを使うと簡潔な書き方で複雑なシェーダーが書けます。それを可能としているのは、Unity のライティングパイプラインで行われる相互作用のための高次元の抽象化です。ほとんどのサーフェスシェーダーは自動でフォワードと deferred ライティングをサポートします。サーフェスシェーダーは数行の Cg/HLSL によって書くことができ、さらに多くのコードがそれらによって自動生成されます。
ライトを使用しない場合は、サーフェスシェーダーを使用しないでください。ポストプロセスエフェクト や多くの特殊エフェクトシェーダーに関しては、サーフェスシェーダーは 2 次的な最適化オプションです。なぜなら、それらは正当な理由無しに多くのライティングの計算を行うからです。
シェーダーがライティングとの相互作用を必要としない場合、または、サーフェスシェーダーが扱えないようなエキゾチックなエフェクトが必要な場合は、頂点シェーダーとフラグメント シェーダー が必用です。この方法で書かれたシェーダープログラムは、必要なエフェクトを作成するためのもっとも柔軟なやり方です (サーフェスシェーダーも自動で頂点やフラグメントシェーダーに変換されています)。しかし、相応の対価もあります。つまり、より多くのコードを書かなければならず、ライティングと相互作用させるのがより難しいのです。これらのコードも同様に Cg/HLSL で記述されます。
固定関数シェーダーは、とても簡易なエフェクトのための古いシェーダーシンタックスです。より柔軟性が高いので、プログラムできるシェーダーを作成することが推奨されています。固定関数シェーダーはすべて Microsoft の .FX files や NVIDIA の CgFX に似た ShaderLab という言語で書かれています。内部では、すべての固定関数シェーダーは、シェーダーのインポート時に 頂点シェーダーとフラグメントシェーダー に変換されます。
種類に関係無く、シェーダーのコードの中身は実際にはどれも ShaderLab にラップされています。ShaderLab はシェーダーの構造を整理するのに使われています。以下はその例です。
Shader "MyShader" {
Properties {
_MyTexture ("My Texture", 2D) = "white" { }
// colors や vectors などの他のプロパティもここに置けます
}
SubShader {
// ここに
// - サーフェスシェーダー か
// - 頂点シェーダーとフラグメントシェーダー か
// - 固定関数シェーダー を置きます
}
SubShader {
// 古いグラフィックスカードでも実行できるように
// 簡単なバージョンの SubShader をここに置きます
}
}
ShaderLab シンタックス で ShaderLab シンタックスの基本的な概念について読んでから、以下のチュートリアルに進むことをお勧めします。
チュートリアルにはさまざまな種類のシェーダーに関する豊富な例が含まれています。 Unity の ポストプロセスエフェクト を使うと、シェーダーで多くの素敵なエフェクトを作成できます。
シェーダーの入門編や シェーダーリファレンス を参照してください。
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.