0

如何Effect在类中存储参数?我现在第三天陷入这个问题,我想我会慢慢发疯。

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

我尝试存储ParameterValuein Object 类型

Object ParameterData;

但是我遇到了一个问题,我需要从这门课中阅读……这就是一切都在山下的地方。

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

所以我尝试投射这个对象。

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

但是有了这个我的问题是当我设置它时我需要知道这个对象的具体类型(FloatTexture2D

而且我不能使用类型变量来确定这个对象的类型。我尝试使用(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 回答