AGSL と GLSL の違い

AGSL と GLSL の構文は非常に似ているため、多くの GLSL フラグメント シェーダーを使用できます。 効果を最小限の変更で Android に引き継ぐことができます。AGSL が GLSL を修正 GLSL ES 1.0(OpenGL ES 2.0 で使用されるシェーディング言語)で設定された デバイスのリーチを最大化できます

GLSL フラグメント シェーダーは、 ラスタライザとブレンディングハードウェアですこのシェーダーは、すべての処理を行い、 そしてその色がブレンドステージに フィードされます 作成されます。AGSL でシェーダーを記述する場合、シェーダーを 示しています言語の違いの多くは、この点に起因しています。

シェーダーの実行

GLSL シェーダーと同様に、AGSL シェーダーは main 関数内で実行を開始します。 GLSL とは異なり、この関数はシェーダーの位置を「ローカル」で受け取ります。座標を表す パラメータを指定します。gl_FragCoord と似ていますが、フレームバッファではありません。 これらの座標は、関数を呼び出す前に変換されている場合があります。 作成します。シェーダーはピクセルの色を vec4 高精度(GLSL の out vec4 colorgl_FragColor に類似)。

mediump vec4 main(in vec2 fragCoord)

座標空間

GLSL 座標空間と AGSL 座標空間

GLSL を使用して描画されたシェーダーと AGSL を使用して描画されたほぼ同じシェーダー

AGSL と GLSL は、デフォルトで異なる座標空間を使用します。GLSL では、フラグメントは 座標(fragCoord)は左下を基準とします。AGSL が画面と一致 Canvas の座標系 つまり、Y 軸は左上隅になります。必要に応じて 解像度をユニフォームとして渡すことで、この 2 つのスペース間で変換できます。 Y 軸の値として resolution.y - fragCoord.y を使用しています。または ローカル変換行列をシェーダーに適用できます。

// AGSL to GLSL coordinate space transformation matrix
val localMatrix = Matrix()
localMatrix.postScale(1.0f, -1.0f)
localMatrix.postTranslate(0.0f, viewHeight)
gridShader.setLocalMatrix(localMatrix)

適合率と型

GLSL 互換の精度修飾子はサポートされていますが、AGSL では half 型と short 型も中精度を表します。

ベクトル型は、名前付きの <base type><columns> として宣言できます。次を使用: vec2 から float2bvec4 から bool4 にそれぞれ変更しました。 行列型は名前付き <base type><columns>x<rows> として宣言できるため、 mat3float3x3 に変更。AGSL では GLSL スタイルの宣言も可能 matvec の場合。これらの型は浮動小数点数にマッピングされます。 相当します。

プリプロセッサ

AGSL は GLSL スタイルをサポートしていません プリプロセッサ 使用します。#define 文を定数変数に変換します。AGSL のコンパイラ では、定数変数の定数折りたたみと分岐消去がサポートされているため、 効率的になります

色空間

Android アプリは色を管理します。キャンバスの色空間によって 描画用の作業用色空間を指定します。ソース コンテンツ( BitmapShader) 色空間もあります。

物理的な正確な照明など、特定の効果については、計算を行う必要があります 線形色空間で表示されますこれを実現するために、AGSL には、 関数:

half3 toLinearSrgb(half3 color)
half3 fromLinearSrgb(half3 color)

これらは、動作色空間と Android の LINEAR_EXTENDED_SRGB 色空間を指定します。この空間では、sRGB 色域(色域)と線形 ですsRGB 色域外の値を表現するには、拡張 (0.0 未満および 1.0 以上)。

ユニフォーム

AGSL ではユニフォームに色が含まれているかどうかがわからないため、自動的に適用されることはありません。 色変換しますhalf4/float4/vec4 にラベルを付けることができます。 layout(color): ユニフォームが画像に使用されることを Android に知らせます。 color: Android で均一な値を有効な色に変換できます 選択します。

AGSL でユニフォームを次のように宣言します。

layout(color) uniform half4 iColor;  // Input color
uniform float2 iResolution;          // Viewport resolution (pixels)

Android のコードでは、ユニフォームを次のように設定できます。

shader.setColorUniform("iColor", Color.GREEN)
shader.setFloatUniform("iResolution", canvas.width.toFloat(), canvas.height.toFloat())