如何使用动态值制作sampler2D结构?

时间:2014-03-05 14:47:37

标签: hlsl

这是我的情景:

texture diffuseMap;

sampler2D diffuseSampler = sampler_state {
    Texture = <diffuseMap>;
    Filter = MIN_MAG_MIP_LINEAR;
    AddressU = WRAP;
    AddressV = WRAP;
};

我希望能够通过将参数传递给我的效果来更改我的C#应用​​程序中的diffuseSampler过滤器值。以下是我拍摄的方式:

#define __DiffuseFilterLinear      0x0
#define __DiffuseFilterAnisotropic 0x1
#define __DiffuseFilterNearest     0x2

int diffuseMapFilter; // Here's where I'll assign, via my application,
                      // a hex value corresponding to one of the three
                      // #defines above

然后,在diffuseSampler内,我想实现相当于使用条件设置Filter值,如下所示:

sampler2D diffuseSampler = sampler_state {
    Texture = <diffuseMap>;

    // Conditionals to pick the right Filter value
    switch (diffuseMapFilter)
    {
    case __DiffuseFilterLinear:
        Filter = MIN_MAG_MIP_LINEAR;
        break;
    case __DiffuseFilterAnisotropic:
        Filter = ANISOTROPIC;
        break;
    case __DiffuseFilterNearest:
        Filter = MIN_MAG_MIP_POINT;
        break;
    }

    AddressU = WRAP;
    AddressV = WRAP;
};

我知道尝试在采样器结构中插入一个开关块可能是一个异端,但我认为它说明了我想要做的事情。

如何根据diffuseSampler参数设置diffuseMapFilter过滤器值?

1 个答案:

答案 0 :(得分:0)

着色器由顶点着色器和像素着色器组成。 3D模型流从应用程序流向顶点着色器,然后流向像素着色器,最后流向帧缓冲区。 a2v结构表示从应用程序传输到顶点着色器的数据结构,从顶点着色器到像素着色器的v2p,以及从像素着色器到帧缓冲区的p2f。下面的程序通过视图矩阵将顶点的位置转换为剪辑空间的位置。

 struct a2v { 
    float4 Position : POSITION; 
  };

在HLSL函数中,struct a2v指定一个顶点结构,表示顶点的数据。

 struct v2p {
    float4 Position : POSITION;
  };

struct v2p指定从顶点到像素着色器的流结构。 Position是float4声明的四维向量。此外,POSITION(称为输出语义)表示初始化的位置类型。

void main(in a2v IN, out v2p OUT, uniform float4x4 ModelViewMatrix) 
  {
    OUT.Position = mul(IN.Position, ModelViewMatrix); 
  }

Here's a tutorial