0

Effectクラスにパラメータを保存する方法は?私は今3日目この問題で立ち往生していて、私はゆっくりと狂気になるだろうと思います。

EffectParameter各オブジェクトのシェーダーのパラメーター値を動的に格納/設定できるように、という名前のクラスを作成しようとしました。

ParameterValueオブジェクトタイプにを格納しようとしました

Object ParameterData;

しかし、私はこのクラスから読む必要があるという問題に遭遇しました....これはすべてが丘を下って行くところです。

このメソッドeffect.Parameters["parametername"].SetValue() は、いくつかの種類のタイプのみを受け入れます。そして、このメソッドにオブジェクトを渡すことはできません。

そこで、このオブジェクトをキャストしようとしました。

public T ReadData<T>()
{
    return (T)(object)this.ParameterDataVal;
}

しかし、これで私の問題は、私がそれを設定するときにこのオブジェクトの特定のタイプを知る必要があるということです(FloatなどTexture2D

また、型変数を使用してこのオブジェクトの型を判別することはできません。使ってみまし(typevariable)(object)this.ParameterDataVal; たが、エラーが出ました。

私は怒っていたので、動的型付けの解決策をネットで探しました。しかし、私は自分の問題の方法を見つけられませんでした。

それから私は多分私が単純なことの問題を作っていることに気づきました。そこでEffectParameter、データの保存にを使用することにしました。

しかし、このデータをエフェクトに設定しようとすると、別の問題が発生しました。メソッドを使用してこのパラメーターをエフェクトに指定しようとしましたが、「読み取り専用です」というエラーが発生します。

EffectParameterそのため、コレクションに自分を追加することはできません。私は多くの方法を試しました。しかし、成功しません。

私はこれで完全に迷子になっています。他に何をすべきかわかりません。

誰かがこの問題に遭遇したことがありますか、誰かが私に良い解決策の計画を提供することができますか?

4

1 に答える 1

0

ソリューションのクラス:

    public class ObjectShader
    {

        public Effect effect;

        public System.Drawing.Image TextureImage;

        public string ShaderName;

        string TechniqueName;


            public ObjectShader(string name,Effect ef)
            {
                this.ShaderName = name;
                this.effect = ef;


            }


            public void SetValue(string name, System.Drawing.Image val)
            {
                this.TextureImage = val;

            }



            public void SetValue(string name,float val)
            {
                this.effect.Parameters[name].SetValue(val);

            }

            public void SetValue(string name, float[] val)
            {
                this.effect.Parameters[name].SetValue(val);

            }


            public void SetValue(string name, string val)
            {
                this.effect.Parameters[name].SetValue(val);

            }

            public void SetValue(string name, Matrix val)
            {
                this.effect.Parameters[name].SetValue(val);

            }

            public void SetValue(string name, Matrix[] val)
            {
                this.effect.Parameters[name].SetValue(val);

            }

            public void SetValue(string name, Vector2 val)
            {
                this.effect.Parameters[name].SetValue(val);

            }

            public void SetValue(string name, Vector2[] val)
            {
                this.effect.Parameters[name].SetValue(val);

            }

            public void SetValue(string name, Vector3 val)
            {
                this.effect.Parameters[name].SetValue(val);

            }

            public void SetValue(string name, Vector3[] val)
            {
                this.effect.Parameters[name].SetValue(val);

            }

            public void SetValue(string name, int val)
            {
                this.effect.Parameters[name].SetValue(val);

            }
            public void SetValue(string name, int[] val)
            {
                this.effect.Parameters[name].SetValue(val);

            }


    }
}
于 2012-06-26T20:48:06.117 に答える