0

プログラミング言語で定義された動作としてスウィズリングをどのように記述しますか? (GLSL の行列やベクトルのようなスウィズリング メンバー) では、一部のメンバーでスウィズリングの定義を可能にするプログラミング言語を作成したい場合、どのようにすればよいでしょうか? たとえば、私はこれを行うことができます:

struct
{
    swizzable
    {
        float x, float y, float z, float w
    }
}

しかし、これには多くのものが欠けています。たとえば、要素を多かれ少なかれ入れ替えたり、サブセットに割り当てたり、要素を逆方向に割り当てたりすると、何を返すかを定義しません。GLSL のように、v.xyz を実行して、v という Vec4 から Vec3 を作成できます。または、メンバーのサブセットを割り当てることもできます: v.zyx = ... 任意の順序で。

したがって、この切り替え可能な部分構造は解決策ではありません (または、少なくとも制限が多すぎます)。もう 1 つの方法は、swizzled メンバーの配列を返すことであり、暗黙のキャスト (コンストラクターを使用) によって必要な要素が生成されます。

struct Vec2
{
    swizzable { float x, float y }
    Vec2(float[2] elements)
    { x = elements[0]; y = elements[1]; }
}

struct Vec3
{
    swizzable { float x, float y, float z }
}

したがって、スウィズリングを介して Vec3 の x と y にアクセスすると、float[2] が得られ、Vec2 のコンストラクターがあるため、この配列をそれに割り当てることができます (暗黙的に vec2 をインスタンス化します)。

これはより良い解決策のように見えますが、それでも: どうすればもっとうまくやれるでしょうか?

編集:申し訳ありませんが、質問を指定しませんでした:この種のことをサポートするプログラミング言語を実装したいです。

4

1 に答える 1

0

適切で詳細な答えを出す方法がわからないので、ここに 1 つのアイデアを示します。

私の理解が正しければ、スウィズリングは主に構文上の利便性です。ページhttps://www.opengl.org/wiki/GLSL_Optimizationsには、次のスウィズリングの例が示されています。

gl_FragColor = mycolor.xyzw * constantList.xxxy + constantList.yyyx;

これは、次のようなものの単純な構文上の省略形である可能性があります。

gl_FragColor = Vector(mycolor.x, mycolor.y, mycolor.z, mycolor.w)
    * Vector(constantList.x, constantList.x, constantList.x, constantList.y)
    + Vector(constantList.y, constantList.y, constantList.y, constantList.x);

したがって、1 つのステップは、短い構文を解析し、長い構文と同様の意味として解釈する方法を理解することかもしれません。

構造体をより複雑なものとして宣言する必要がある理由がわかりませんstruct myStruct { float x, float y, float z, float w }。言語自体は、このスウィズルを実装する方法のすべての詳細を処理できる必要があります。

于 2016-07-21T19:51:26.877 に答える