RuntimeShader クラス
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
は RuntimeShader
、ユーザー定義の Android Graphics Shading Language (AGSL) 関数の出力に基づいてピクセルごとの色を計算します。
[Android.Runtime.Register("android/graphics/RuntimeShader", ApiSince=33, DoNotGenerateAcw=true)]
public class RuntimeShader : Android.Graphics.Shader
[<Android.Runtime.Register("android/graphics/RuntimeShader", ApiSince=33, DoNotGenerateAcw=true)>]
type RuntimeShader = class
inherit Shader
- 継承
- 属性
注釈
は RuntimeShader
、ユーザー定義の Android Graphics Shading Language (AGSL) 関数の出力に基づいてピクセルごとの色を計算します。
<h3>Android グラフィックス シェーディング言語</h3>
AGSL 構文は OpenGL ES 網かけ言語とよく似ていますが、ここで強調表示されている重要な違いがいくつかあります。 これらの違いの大部分は、1 つの基本的な事実でまとめられます。 <b>GPU シェーディング言語では、GPU パイプラインのステージをプログラミングしています。 AGSL では、 または RenderNode
描画パイプラインのステージをCanvas
プログラミングしています。</B>
特に、GLSL フラグメント シェーダーは、ラスタライザーとブレンド ハードウェアの間の GPU の動作全体を制御します。 そのシェーダーは、色を計算するためのすべての作業を行います。生成される色は、パイプラインのブレンド ステージに送られるものです。
これに対し、AGSL 関数は、より大きなパイプラインの一部として存在します。 描画操作を Canvas
発行すると、Android (通常) は 1 つの GPU フラグメント シェーダーをアセンブルして、必要なすべての作業を実行します。 このシェーダーには通常、いくつかの部分が含まれています。 たとえば、次のようなものがあります。
<ul><li>描画中の図形の内側または外側 (またはアンチエイリアシングを適用する可能性がある境界線)< にピクセルが含まれるかどうかを評価します。/li li><>ピクセルがクリッピング領域の内側または外側にあるかどうかを評価します (再び、境界ピクセルに対してアンチエイリアシング ロジックが可能です)。<の 、、および BlendMode
Paint
の Shader
ColorFilter
/li li>><Logic。</li li><>色空間変換コード。Android のカラー管理の一部として。</li></ul>
は、他Shader
のRuntimeShader
型と同様に、GPU のフラグメント シェーダーに効果的に関数を提供します。
<h3>AGSL シェーダー実行</h3>
GLSL シェーダーと同様に、AGSL シェーダーはメイン関数で実行を開始します。 GLSL とは異なり、関数は入力パラメーターとして または RenderNode
座標空間内Canvas
のピクセルの位置 (gl_fragCoordに似ています) を受け取り、網掛けされる色を vec4 として返します (GLSL の vec4 色またはgl_FragColorに似ています)。
vec4 main(vec2 canvas_coordinates);
AGSL と GLSL では、既定で異なる座標空間が使用されます。 GLSL では、フラグメント座標 (fragCoord) は左下に対して相対的です。 AGSL は、左上隅として原点を持つ Android Canvas
の画面座標系と一致します。 つまり、メイン関数のパラメーターとして提供される座標は、このシェーダーに適用されるShader#getLocalMatrix(Matrix)
変換を除き、キャンバスに対してローカルになります。 さらに、 を使用して #setInputShader(String, Shader)
シェーダーが別のによって呼び出された場合、その親シェーダーは入力座標を任意に変更できます。
<h3>AGSL と色空間</h3>
Android グラフィックスと拡張機能 RuntimeShader
によって、色が管理されます。 AGSL シェーダーの動作 ColorSpace
は、ターゲットの色空間として定義されます。これは、ほとんどの場合、 によって Window#setColorMode(int)
決定されます。
AGSL シェーダーを作成するときに、作業色空間が何であるかはわかりません。 多くの効果では、既定で色入力が作業色空間に自動的に変換されるため、これは問題ありません。 特定の効果の場合は、固定の既知の色空間で計算を行う必要があります。 一般的な例は照明です。物理的に正確な照明を得るには、線形色空間で数学を行う必要があります。 これを支援するために、AGSL には、作業色空間と色空間の間で色を変換する 2 つの組み込み関数が ColorSpace.Named#LINEAR_EXTENDED_SRGB
用意されています。
vec3 toLinearSrgb(vec3 color);
vec3 fromLinearSrgb(vec3 color);
<h3>AGSL と事前乗算アルファ</h3>
透明な色を扱う場合、2 つの (一般的な) 表現が考えられます。直線 (関連付けられていない) アルファと、事前乗算 (関連付けられた) アルファです。 ASGL では、メイン関数によって返される色が事前に乗算されることが想定されています。 AGSL による事前乗算アルファの使用は、次のことを意味します。
<ul><li>AGSL シェーダーが透明な色を返す場合は、必ず RGB に A を乗算してください。結果の色は、[R、G、B、A]ではなく、[R*A,G*A,B*A]である必要があります。</li li><>より複雑なシェーダーの場合は、事前に乗算された色と直線色のどちらであるかを理解する必要があります。 両方の種類の色を混在させる場合、多くの操作は意味がありません。</li></ul>
<h3>Uniforms</h3>
AGSL は GLSL と同様に、ユニフォームの概念を公開します。 AGSL Uniform は、AGSL コードからアクセス可能な読み取り専用のグローバル変数として定義され、 のセッター メソッド RuntimeShader
の数によって初期化されます。 AGSL では、次に示す 2 つのプリミティブの均一なデータ型 (float、int) と 2 つの特殊な型 (色、シェーダー) が公開されています。
<h4>プリミティブ Uniforms</h4>
AGSL では、float と int の 2 つのプリミティブ均一型がサポートされています。配列やマトリックスなど、これらの型のグループ化を表すこれらの型と uniform には、それらを初期化するための対応する RuntimeShader
メソッドがあります。 <table border="2" width="85%" align="center" cellpadding="5"><thead><tr><th>Java Type</th><th>AGSL Type</th<>th>Method</th></tr></thead>
<tbody><tr><td rowspan="4">Floats</td td<>td>float</td><td>RuntimeShader#setFloatUniform(String, float)
><</tr td><<>td>vec2</td<>td<>RuntimeShader#setFloatUniform(String, float, float)
/td<>/tr tr><<>td>vec3</td><tdRuntimeShader#setFloatUniform(String, float, float, float)
<>/td/tr td><><><> vec4</td<>td>RuntimeShader#setFloatUniform(String, float, float, float, float)
</<>tr tr tr><><td rowspan="4">Integers</td td>><int</td<>td<>RuntimeShader#setIntUniform(String, int)
/tr td>><</tr><td>ivec2</td<>td<RuntimeShader#setIntUniform(String, int, int)
>/td></tr tr><<>td>ivec3</td<>td>RuntimeShader#setIntUniform(String, int, int, int)
</td/tr<><>td><> ivec4</td td><><RuntimeShader#setIntUniform(String, int, int, int, int)
/tr>><<Tr><td rowspan="2">マトリックスと配列</td td><>mat2、mat3、および mat4、float[]</td><td<>RuntimeShader#setFloatUniform(String, float[])
/td<>/tr tr<<>>td>int[]</td tdRuntimeShader#setIntUniform(String, int[])
>><</td<>/tr<>/tbody></table>
たとえば、出力カラーの透明度を調整するために float 均一を使用する単純な AGSL シェーダーは、次のようになります。
uniform float alpha;
vec4 main(vec2 canvas_coordinates) {
vec3 red = vec3(1.0, 0.0, 0.0);
return vec4(red * alpha, alpha);
}
そのプログラムで を RuntimeShader
作成した後、alpha の値を使用して を呼び出 RuntimeShader#setFloatUniform(String, float)
すことによって、フレームごとに uniform を初期化および更新できます。 プリミティブ uniform の値は、AGSL シェーダーで宣言されているが初期化されていない場合、既定値は 0 になります。
<h4>カラーユニフォーム</h4>
AGSL では、均一変数に色が含まれているかどうかはわかりません。実行時にシェーダーの作業色空間に自動的に変換されることはありません。 ただし、vec4 uniform に "layout(color)" 修飾子を付けることができます。これにより、Android は、その均一が色として使用されることを認識できます。 これにより、AGSL は、均一な値を作業色空間に変換できます。 AGSL で、次のように均一を宣言します。
layout(color) uniform vec4 inputColorA;
layout(color) uniform vec4 inputColorB;
vec4 main(vec2 canvas_coordinates) {
// blend the two colors together and return the resulting color
return mix(inputColorA, inputColorB, 0.5);
}
そのプログラムを使用して をRuntimeShader
作成した後、必要な色で 、RuntimeShader#setColorUniform(String, long)
、または を呼び出RuntimeShader#setColorUniform(String, int)
すことによって、フレームごとにユニフォームを初期化およびRuntimeShader#setColorUniform(String, Color)
更新できます。 色の均一の値は、AGSL シェーダーで宣言されているが初期化されていない場合は未定義です。
<h4>シェーダー Uniforms</h4> GLSL では、フラグメント シェーダーでテクスチャをサンプリングできます。 サンプリング テクスチャの代わりに AGSL の場合は、任意 Shader
の からサンプリングできます。これには、 が含まれますが、これらに BitmapShader
限定されません。 オブジェクトに対 Shader
して操作していることを明確にするために、"サンプル" メソッドはありません。 代わりに、シェーダー の uniform には "eval()" メソッドがあります。 この違いにより、AGSL シェーダーは既存のビットマップ シェーダーやグラデーション シェーダー、およびその他 RuntimeShader
のオブジェクトからサンプリングできます。 AGSL で、次のように均一を宣言します。
uniform shader myShader;
vec4 main(vec2 canvas_coordinates) {
// swap the red and blue color channels when sampling from myShader
return myShader.eval(canvas_coordinates).bgra;
}
そのプログラムで を RuntimeShader
作成した後、シェーダー の均一は、目的のシェーダーを使用して を呼び出 RuntimeShader#setInputShader(String, Shader)
すことによって、フレームごとに初期化および更新できます。 AGSL シェーダーで宣言されているが初期化されていない場合、シェーダー の uniform の値は未定義です。
ほとんどの BitmapShader
には色管理する必要がある色が含まれていますが、一部には実際には色ではないデータが含まれています。 これには、法線、マテリアル プロパティ (粗さなど)、高さマップ、またはビットマップに格納されるその他の純粋な数学的データを格納するビットマップが含まれます。 AGSL でこれらの種類のシェーダーを使用する場合は、 で初期化することをお勧めします #setInputBuffer(String, BitmapShader)
。 この方法で初期化されたシェーダーは、通常BitmapShader
の (フィルター処理やタイリングを含む) とよく似ていますが、いくつかの大きな違いがあります。<ul><li>色空間変換は適用されません (ビットマップの色空間は無視されます)。<に対して false Bitmap#isPremultiplied()
を返す /li li><>Bitmaps は、自動的にプリ乗算されません。</li></ul>
さらに、 からの BitmapShader
サンプリングでは、シェーダーで正規化された座標 (GLSL のテクスチャなど) が使用されないことに注意してください。 左上隅には (0、0)、右下隅には (幅、高さ) を使用します。 通常、これはまさにあなたが望むものです。 AGSL プログラムに渡された座標に基づいてシェーダーを評価する場合、スケールは正しいです。 ただし、(ビットマップの何らかの再マッピングを行うために) これらの座標を調整する場合は、座標がキャンバスに対してローカルであることを覚えておいてください。
の android.graphics.RuntimeShader
Java ドキュメント。
このページの一部は、によって作成および共有された作業に基づく変更であり、に記載されている条件に従って使用されます。
コンストラクター
RuntimeShader(IntPtr, JniHandleOwnership) |
は |
RuntimeShader(String) |
新しい RuntimeShader を作成します。 |
プロパティ
Class |
この |
Handle |
基になる Android インスタンスへのハンドル。 (継承元 Object) |
JniIdentityHashCode |
は |
JniPeerMembers |
は |
PeerReference |
は |
ThresholdClass |
は |
ThresholdType |
は |
メソッド
Clone() |
このオブジェクトのコピーを作成して返します。 (継承元 Object) |
Dispose() |
は |
Dispose(Boolean) |
は |
Equals(Object) |
他のオブジェクトがこのオブジェクトと "等しい" かどうかを示します。 (継承元 Object) |
GetHashCode() |
オブジェクトのハッシュ コード値を返します。 (継承元 Object) |
GetLocalMatrix(Matrix) |
シェーダーに非 ID ローカル マトリックスがある場合は true を返します。 (継承元 Shader) |
JavaFinalize() |
オブジェクトへの参照がなくなったとガベージ コレクションが判断したときに、オブジェクトのガベージ コレクターによって呼び出されます。 (継承元 Object) |
Notify() |
このオブジェクトのモニターで待機している 1 つのスレッドを起動します。 (継承元 Object) |
NotifyAll() |
このオブジェクトのモニターで待機しているすべてのスレッドを起動します。 (継承元 Object) |
SetColorUniform(String, Color) |
このシェーダーに対応する均一な色の値を設定します。 |
SetColorUniform(String, ColorObject) |
このシェーダーに対応する均一な色の値を設定します。 |
SetColorUniform(String, Int64) |
このシェーダーに対応する均一な色の値を設定します。 |
SetFloatUniform(String, Single) |
このシェーダーに対応する均一な値を設定します。 |
SetFloatUniform(String, Single, Single) |
このシェーダーに対応する均一な値を設定します。 |
SetFloatUniform(String, Single, Single, Single) |
このシェーダーに対応する均一な値を設定します。 |
SetFloatUniform(String, Single, Single, Single, Single) |
このシェーダーに対応する均一な値を設定します。 |
SetFloatUniform(String, Single[]) |
このシェーダーに対応する均一な値を設定します。 |
SetHandle(IntPtr, JniHandleOwnership) |
Handle プロパティを設定します。 (継承元 Object) |
SetInputBuffer(String, BitmapShader) |
指定したシェーダー パラメーターに均一シェーダーを割り当てます。 |
SetInputShader(String, Shader) |
指定したシェーダー パラメーターに均一シェーダーを割り当てます。 |
SetIntUniform(String, Int32) |
このシェーダーに対応する均一な値を設定します。 |
SetIntUniform(String, Int32, Int32) |
このシェーダーに対応する均一な値を設定します。 |
SetIntUniform(String, Int32, Int32, Int32) |
このシェーダーに対応する均一な値を設定します。 |
SetIntUniform(String, Int32, Int32, Int32, Int32) |
このシェーダーに対応する均一な値を設定します。 |
SetIntUniform(String, Int32[]) |
このシェーダーに対応する均一な値を設定します。 |
SetLocalMatrix(Matrix) |
シェーダーのローカル マトリックスを設定します。 (継承元 Shader) |
ToArray<T>() |
は |
ToString() |
オブジェクトの文字列形式を返します。 (継承元 Object) |
UnregisterFromRuntime() |
は |
Wait() |
現在のスレッドが起動するまで待機します。通常<は、通知</em> または>< em 中断</em によって待機します>。> (継承元 Object) |
Wait(Int64) |
現在のスレッドが起動するまで待機します。通常<は、通知></em> または <>em 中断</em>、または特定のリアルタイムが経過するまで待機します。 (継承元 Object) |
Wait(Int64, Int32) |
現在のスレッドが起動するまで待機します。通常<は、通知></em> または <>em 中断</em>、または特定のリアルタイムが経過するまで待機します。 (継承元 Object) |
明示的なインターフェイスの実装
IJavaPeerable.Disposed() |
は |
IJavaPeerable.DisposeUnlessReferenced() |
は |
IJavaPeerable.Finalized() |
は |
IJavaPeerable.JniManagedPeerState |
は |
IJavaPeerable.SetJniIdentityHashCode(Int32) |
は |
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
は |
IJavaPeerable.SetPeerReference(JniObjectReference) |
は |
拡張メソッド
JavaCast<TResult>(IJavaObject) |
Android ランタイムチェック型変換を実行します。 |
JavaCast<TResult>(IJavaObject) |
は |
GetJniTypeName(IJavaPeerable) |
は |