Unity ShaderエディタツールクラスShaderUtilの共通機能と使い方
Unity のシェーダー エディター ツール クラス ShaderUtil は、シェーダーをコンパイル、インポート、管理するための一連の機能を提供します。この記事では、ShaderUtilクラスの共通機能と使い方を紹介します。
関数のコンパイルとインポート
コンパイルシェーダー
関数シグネチャ:public static bool CompileShader(string source, out string error);
CompileShader 関数は、シェーダーをコンパイルするために使用されます。コンパイルするシェーダー コードを表す文字列パラメーター ソースを受け取り、コンパイルが成功したかどうかを示すブール値を返します。コンパイルが失敗した場合は、out パラメーター error を通じてエラー情報を取得できます。
CompileShader 関数を使用した例を次に示します。
string shaderCode = @"
Shader ""CustomShader"" {
// 着色器代码
}
";
string error;
bool success = ShaderUtil.CompileShader(shaderCode, out error);
if (success)
{
Debug.Log("Shader compiled successfully!");
}
else
{
Debug.LogError("Shader compilation failed: " + error);
}
OpenCompiledShader
関数シグネチャ:public static void OpenCompiledShader(string pathName, int line);
OpenCompiledShader 関数は、コンパイルされたシェーダー ファイルを外部プログラムで開くために使用されます。これは 2 つのパラメーターを受け入れます。 pathName は開くシェーダー ファイルのパスを示し、line はジャンプ先の行数を示します。
OpenCompiledShader 関数を使用した例を次に示します。
string shaderPath = "Assets/Shaders/CustomShader.shader";
int line = 10;
ShaderUtil.OpenCompiledShader(shaderPath, line);
属性とキーワード関数
GetPropertyCount
関数シグネチャ:public static int GetPropertyCount(Shader shader);
この関数は、指定されたシェーダー内の属性の数を取得するために使用されます。Shader オブジェクトを引数として受け取り、そのシェーダ内のアトリビュートの数を返します。プロパティは、マテリアルの外観と動作を制御するシェーダー エディターで定義される変数です。
GetPropertyCount 関数を使用してシェーダー内のプロパティの数を取得する方法を示すサンプル コードを次に示します。
Shader shader = Shader.Find("MyShader");
int propertyCount = ShaderUtil.GetPropertyCount(shader);
Debug.Log("Property count: " + propertyCount);
Getプロパティ名
関数シグネチャ:public static string GetPropertyName(Shader shader, int propertyIndex);
この関数は、指定されたシェーダのアトリビュートの名前を取得するために使用されます。Shader オブジェクトとプロパティのインデックスをパラメータとして受け取り、プロパティの名前を返します。
GetPropertyName 関数を使用してシェーダー内のプロパティの名前を取得する方法を示すサンプル コードを次に示します。
Shader shader = Shader.Find("MyShader");
int propertyIndex = 0;
string propertyName = ShaderUtil.GetPropertyName(shader, propertyIndex);
Debug.Log("Property name: " + propertyName);
GetShaderKeywords
関数シグネチャ:public static string[] GetShaderKeywords(Shader shader);
この関数は、指定されたシェーダのキーワードを取得するために使用されます。キーワードは、シェーダーのさまざまな機能と効果を制御するためにシェーダー エディターで定義される識別子です。
以下は、GetShaderKeywords 関数を使用してシェーダー キーワードを取得する方法を示すサンプル コードです。
Shader shader = Shader.Find("MyShader");
string[] keywords = ShaderUtil.GetShaderKeywords(shader);
Debug.Log("Shader keywords: " + string.Join(", ", keywords));
SetShaderKeywords
関数シグネチャ:public static void SetShaderKeywords(Shader shader, string[] keywords);
この関数は、指定されたシェーダのキーワードを設定するために使用されます。Shader オブジェクトとキーワードの配列をパラメータとして受け取り、これらのキーワードをシェーダに適用します。
以下は、SetShaderKeywords 関数を使用してシェーダー キーワードを設定する方法を示すサンプル コードです。
Shader shader = Shader.Find("MyShader");
string[] keywords = new string[] { "KEYWORD1", "KEYWORD2" };
ShaderUtil.SetShaderKeywords(shader, keywords);
レンダリングテクスチャ関数
1.GetRenderTextureFormat
public static RenderTextureFormat GetRenderTextureFormat(string name);
この関数は、指定された名前のレンダリング テクスチャ フォーマットを取得するために使用されます。レンダリング テクスチャの名前を示す文字列パラメータ名を受け取り、対応するレンダリング テクスチャ フォーマットを示す RenderTextureFormat 列挙値を返します。
2.GetRenderTargetCount
public static int GetRenderTargetCount();
この関数は、レンダー ターゲットの現在の数を取得するために使用されます。現在のレンダー ターゲットの数を表す整数値を返します。
3.GetRenderTargetName
public static string GetRenderTargetName(int index);
この関数は、指定されたインデックスのレンダー ターゲットの名前を取得するために使用されます。レンダー ターゲットのインデックスを表す整数パラメーター インデックスを受け取り、対応するレンダー ターゲットの名前を表す文字列値を返します。
4.GetRenderTargetPropertyCount
public static int GetRenderTargetPropertyCount(int index);
この関数は、指定されたレンダー ターゲットの属性の数を取得するために使用されます。レンダー ターゲットのインデックスを表す整数パラメーター インデックスを受け取り、対応するレンダー ターゲットのプロパティの数を表す整数値を返します。
5.GetRenderTargetPropertyName
public static string GetRenderTargetPropertyName(int index, int propIndex);
この関数は、指定されたレンダー ターゲットの属性名を取得するために使用されます。これは、それぞれレンダリング ターゲットのインデックスとプロパティのインデックスを表す 2 つの整数パラメーター、index と propIndex を受け取り、対応するプロパティの名前を表す文字列値を返します。
6.GetRenderTargetPropertyType
public static ShaderUtil.ShaderPropertyType GetRenderTargetPropertyType(int index, int propIndex);
この関数は、指定されたレンダー ターゲットの属性タイプを取得するために使用されます。これは、それぞれレンダリング ターゲットのインデックスとプロパティのインデックスを表す 2 つの整数パラメーター Index と propIndex を受け取り、対応するプロパティのタイプを表す ShaderUtil.ShaderPropertyType 列挙値を返します。
7.RenderTargetPropertyValueの取得
public static float GetRenderTargetPropertyValue(int index, int propIndex);
この関数は、指定されたレンダー ターゲットの属性値を取得するために使用されます。これは、それぞれレンダリング ターゲットのインデックスとプロパティのインデックスを表す 2 つの整数パラメーター、index と propIndex を受け取り、対応するプロパティの値を表す浮動小数点値を返します。
8. SetRenderTargetPropertyCount
public static void SetRenderTargetPropertyCount(int index, int count);
この関数は、指定されたレンダー ターゲットのプロパティの数を設定するために使用されます。これは、それぞれレンダー ターゲットのインデックスとプロパティの数を表す 2 つの整数パラメーター、index と count を受け入れます。
9. SetRenderTargetPropertyName
public static void SetRenderTargetPropertyName(int index, int propIndex, string name);
この関数は、指定されたレンダー ターゲットのプロパティ名を設定するために使用されます。これは、index、propIndex、name の 3 つのパラメータを受け取ります。これらはそれぞれ、レンダリング ターゲットのインデックス、プロパティのインデックス、プロパティの名前を表します。
10. SetRenderTargetPropertyType
public static void SetRenderTargetPropertyType(int index, int propIndex, ShaderUtil.ShaderPropertyType type);
この関数は、指定されたレンダー ターゲットの属性タイプを設定するために使用されます。これは、レンダリング ターゲットのインデックス、プロパティのインデックス、プロパティのタイプをそれぞれ表す、index、propIndex、type の 3 つのパラメータを受け取ります。
11.RenderTargetPropertyValue の設定
public static void SetRenderTargetPropertyValue(int index, int propIndex, float value);
この関数は、指定されたレンダー ターゲットの属性値を設定するために使用されます。これは、レンダリング ターゲットのインデックス、プロパティのインデックス、プロパティの値をそれぞれ表す、index、propIndex、および value の 3 つのパラメータを受け入れます。
サンプルコード
using UnityEngine;
public class ShaderUtilExample : MonoBehaviour
{
void Start()
{
// 获取渲染纹理格式
RenderTextureFormat format = ShaderUtil.GetRenderTextureFormat("MyRenderTexture");
Debug.Log("RenderTexture format: " + format);
// 获取渲染目标数量
int targetCount = ShaderUtil.GetRenderTargetCount();
Debug.Log("Render target count: " + targetCount);
// 获取渲染目标名称
string targetName = ShaderUtil.GetRenderTargetName(0);
Debug.Log("Render target name: " + targetName);
// 获取渲染目标属性数量
int propertyCount = ShaderUtil.GetRenderTargetPropertyCount(0);
Debug.Log("Render target property count: " + propertyCount);
// 获取渲染目标属性名称
string propertyName = ShaderUtil.GetRenderTargetPropertyName(0, 0);
Debug.Log("Render target property name: " + propertyName);
// 获取渲染目标属性类型
ShaderUtil.ShaderPropertyType propertyType = ShaderUtil.GetRenderTargetPropertyType(0, 0);
Debug.Log("Render target property type: " + propertyType);
// 获取渲染目标属性值
float propertyValue = ShaderUtil.GetRenderTargetPropertyValue(0, 0);
Debug.Log("Render target property value: " + propertyValue);
// 设置渲染目标属性数量
ShaderUtil.SetRenderTargetPropertyCount(0, 2);
// 设置渲染目标属性名称
ShaderUtil.SetRenderTargetPropertyName(0, 0, "Property1");
ShaderUtil.SetRenderTargetPropertyName(0, 1, "Property2");
// 设置渲染目标属性类型
ShaderUtil.SetRenderTargetPropertyType(0, 0, ShaderUtil.ShaderPropertyType.Float);
ShaderUtil.SetRenderTargetPropertyType(0, 1, ShaderUtil.ShaderPropertyType.Color);
// 设置渲染目标属性值
ShaderUtil.SetRenderTargetPropertyValue(0, 0, 1.0f);
ShaderUtil.SetRenderTargetPropertyValue(0, 1, Color.red);
}
}
その他の機能
マテリアルの取得
public static Material GetMaterial(Renderer renderer, int materialIndex);
この関数は、指定されたレンダラー (Renderer) 上の指定されたインデックス (materialIndex) のマテリアル インスタンスを取得するために使用されます。Unity では、レンダラーに複数のマテリアルを含めることができ、それぞれがサブグリッド (サブメッシュ) に対応します。使用例を次に示します。
Renderer renderer = GetComponent<Renderer>();
Material material = ShaderUtil.GetMaterial(renderer, 0);
Getマテリアルプロパティ
public static float GetMaterialProperty(Material material, int propertyIndex);
public static Vector4 GetMaterialProperty(Material material, int propertyIndex, bool isBatchable);
この関数は、マテリアル (マテリアル) の指定されたインデックス (propertyIndex) のプロパティ (Property) の値を取得するために使用されます。属性には、浮動小数点、ベクトルなどを指定できます。使用例を次に示します。
Material material = GetComponent<Renderer>().material;
float floatValue = ShaderUtil.GetMaterialProperty(material, 0);
Vector4 vectorValue = ShaderUtil.GetMaterialProperty(material, 1);
Getマテリアルプロパティインデックス
public static int GetMaterialPropertyIndex(Material material, string propertyName);
この関数は、マテリアル (マテリアル) 上の指定されたプロパティ (propertyName) のインデックス (propertyIndex) を取得するために使用されます。使用例を次に示します。
Material material = GetComponent<Renderer>().material;
int propertyIndex = ShaderUtil.GetMaterialPropertyIndex(material, "_Color");
Getマテリアルプロパティタイプ
public static ShaderUtil.ShaderPropertyType GetMaterialPropertyType(Material material, int propertyIndex);
この関数は、マテリアル (マテリアル) 上の指定されたインデックス (propertyIndex) のプロパティ (Property) のタイプ (ShaderPropertyType) を取得するために使用されます。使用例を次に示します。
Material material = GetComponent<Renderer>().material;
ShaderUtil.ShaderPropertyType propertyType = ShaderUtil.GetMaterialPropertyType(material, 0);
GetmaterialPropertyDefaultValue
public static float GetMaterialPropertyDefaultValue(Material material, int propertyIndex);
public static Vector4 GetMaterialPropertyDefaultValue(Material material, int propertyIndex, bool isBatchable);
この関数は、マテリアル (マテリアル) の指定されたインデックス (propertyIndex) のプロパティ (Property) のデフォルト値を取得するために使用されます。使用例を次に示します。
Material material = GetComponent<Renderer>().material;
float defaultValue = ShaderUtil.GetMaterialPropertyDefaultValue(material, 0);
Vector4 defaultVector = ShaderUtil.GetMaterialPropertyDefaultValue(material, 1);
Getマテリアルプロパティテクスチャ寸法
public static TextureDimension GetMaterialPropertyTextureDimension(Material material, int propertyIndex);
この関数は、マテリアル (マテリアル) 上の指定されたインデックス (propertyIndex) のテクスチャ プロパティ (Texture Property) の寸法 (TextureDimension) を取得するために使用されます。使用例を次に示します。
Material material = GetComponent<Renderer>().material;
TextureDimension dimension = ShaderUtil.GetMaterialPropertyTextureDimension(material, 0);
GetMaterialPropertyTextureDefaultName
public static string GetMaterialPropertyTextureDefaultName(Material material, int propertyIndex);
この関数は、マテリアル (マテリアル) の指定されたインデックス (propertyIndex) にあるテクスチャ プロパティ (テクスチャ プロパティ) のデフォルト名を取得するために使用されます。使用例を次に示します。
Material material = GetComponent<Renderer>().material;
string defaultName = ShaderUtil.GetMaterialPropertyTextureDefaultName(material, 0);
GetGlobalFloat
public static float GetGlobalFloat(string name);
この関数は、グローバル Float プロパティの値を取得するために使用されます。使用例を次に示します。
float globalFloat = ShaderUtil.GetGlobalFloat("_MyGlobalFloat");
GetGlobalInt
public static int GetGlobalInt(string name);
この関数は、Global Int プロパティの値を取得するために使用されます。使用例を次に示します。
int globalInt = ShaderUtil.GetGlobalInt("_MyGlobalInt");
GetGlobalVector
public static Vector4 GetGlobalVector(string name);
この関数は、グローバル ベクトル プロパティの値を取得するために使用されます。使用例を次に示します。
Vector4 globalVector = ShaderUtil.GetGlobalVector("_MyGlobalVector");
GetGlobalMatrix
public static Matrix4x4 GetGlobalMatrix(string name);
この関数は、グローバル マトリックス プロパティの値を取得するために使用されます。使用例を次に示します。
Matrix4x4 globalMatrix = ShaderUtil.GetGlobalMatrix("_MyGlobalMatrix");
グローバルテクスチャの取得
public static Texture GetGlobalTexture(string name);
この関数は、グローバル テクスチャ プロパティの値を取得するために使用されます。使用例を次に示します。
Texture globalTexture = ShaderUtil.GetGlobalTexture("_MyGlobalTexture");
SetGlobalFloat
public static void SetGlobalFloat(string name, float value);
この関数は、Global Float プロパティの値を設定するために使用されます。使用例を次に示します。
ShaderUtil.SetGlobalFloat("_MyGlobalFloat", 1.5f);
これにより、「_MyGlobalFloat」という名前のグローバル float プロパティが 1.5 に設定されます。
SetGlobalInt
public static void SetGlobalInt(string name, int value);
この関数は、Global Int プロパティの値を設定するために使用されます。使用例を次に示します。
ShaderUtil.SetGlobalInt("_MyGlobalInt", 10);
これにより、「_MyGlobalInt」という名前のグローバル整数プロパティが 10 に設定されます。
セットグローバルベクトル
public static void SetGlobalVector(string name, Vector4 value);
この関数は、グローバル ベクトル プロパティの値を設定するために使用されます。使用例を次に示します。
ShaderUtil.SetGlobalVector("_MyGlobalVector", new Vector4(1, 2, 3, 4));
これにより、「_MyGlobalVector」という名前のグローバル ベクター プロパティが (1、2、3、4) に設定されます。
グローバルマトリックスの設定
public static void SetGlobalMatrix(string name, Matrix4x4 value);
この関数は、グローバル マトリックス プロパティの値を設定するために使用されます。使用例を次に示します。
Matrix4x4 matrix = Matrix4x4.identity;
ShaderUtil.SetGlobalMatrix("_MyGlobalMatrix", matrix);
これにより、「_MyGlobalMatrix」という名前のグローバル行列プロパティが単位行列に設定されます。
グローバルテクスチャの設定
public static void SetGlobalTexture(string name, Texture value);
この関数は、グローバル テクスチャ プロパティの値を設定するために使用されます。使用例を次に示します。
Texture texture = Resources.Load<Texture>("MyTexture");
ShaderUtil.SetGlobalTexture("_MyGlobalTexture", texture);
これにより、「_MyGlobalTexture」という名前のグローバル テクスチャ プロパティが「MyTexture」という名前のリソース テクスチャに設定されます。
技術記事に誤りがある可能性があることを心よりお詫び申し上げます。情報が正確で信頼できるものであることを保証するための努力が払われていますが、技術情勢は常に変化しているため、間違いは避けられません。バグを見つけた場合やご質問がある場合は、私までご連絡ください。間違いを修正し、より正確な情報を提供できるよう最善を尽くします。
改めて心よりお詫び申し上げます。より良い読書体験と正確な技術情報を提供するために、より慎重に記事を見直し、更新していきます。
ご理解とご支援をよろしくお願いいたします。