C# 如何在类中存储效果参数?

C# 如何在类中存储效果参数?,c#,xna,shader,effect,C#,Xna,Shader,Effect,如何在类中存储效果参数? 我已经第三天陷入这个问题了,我想我会慢慢变得疯狂 我尝试创建一个名为EffectParameter的类,以便可以动态存储/设置每个对象着色器的参数值 我尝试将ParameterValue存储在对象类型中 Object ParameterData; 但是我遇到了一个问题,我需要阅读这节课的内容……这就是一切都会失败的地方 方法effect.Parameters[parametername].SetValue只接受几种类型。 我无法将对象传递给此方法 所以我试着投下这个物

如何在类中存储效果参数? 我已经第三天陷入这个问题了,我想我会慢慢变得疯狂

我尝试创建一个名为EffectParameter的类,以便可以动态存储/设置每个对象着色器的参数值

我尝试将ParameterValue存储在对象类型中

Object ParameterData;
但是我遇到了一个问题,我需要阅读这节课的内容……这就是一切都会失败的地方

方法effect.Parameters[parametername].SetValue只接受几种类型。 我无法将对象传递给此方法

所以我试着投下这个物体

public T ReadData<T>()
{
    return (T)(object)this.ParameterDataVal;
}
但我的问题是,当我设置它Float、Texture2D等时,我需要知道这个对象的具体类型

我不能使用类型变量来确定这个对象的类型。 我尝试使用typevariableobjectthis.ParameterDataVal; 但它只是给了我错误

我很生气,所以我在网上搜索动态键入的解决方案。 但我找不到解决问题的方法

然后我意识到也许我把问题简单化了。 所以我决定使用EffectParameter来存储数据

但后来我又遇到了另一个问题,当我试图将这些数据设置为。。。。 所以我试着用一个方法给这个参数一个效果,但是我仍然得到一个错误“它是只读的”

因此,我无法将EffectParameter添加到集合中。 我尝试了很多方法。但是没有成功

我完全迷路了。我不知道还能做什么

任何人都遇到过这个问题,或者有人能为我提供一个好的解决方案吗?

解决方案的类别:

    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);

            }


    }
}

我认为你们的班级布局不清楚。您使用的是具有某种字典类型的属性参数的类效果吗?SetValue是该字典的一种方法吗?更多的代码会有所帮助。我尝试在第二个解决方案中使用,我存储了一个EffectParameter对象,因此在构造函数中它只是一个带有SetValue的新EffectParameter。所以我的EffectParameter已经有了值。但是,当我想调用一个方法将此effectparameter设置为effect时,我只会得到有关该效果的错误。Parameters是只读的,我无法从类中添加我的effect参数。我不知道解决办法,我不太明白你的意思。请发布您对效果的定义和其他相关代码。我提供了所有东西来理解我的问题。@phg-效果和效果参数都是通过XNA定义的,因此他无法更改这些。至于OP,我不知道你为什么觉得有必要这么做。如果每个对象都需要单独设置效果参数,为什么不在对象类中创建一个方法,该方法接受效果作为参数,它们是引用,对吗?不是structs?,并根据对象的需要修改其变量?然后在绘制对象之前调用该方法。