在MonoGame中为C#设置着色器的纹理过滤器

时间:2016-11-26 16:58:13

标签: c# xna shader monogame hlsl

假设我在着色器中有这两个变量:

HLSL

texture ModelTexture;
sampler2D TextureSampler

这就是我设置纹理的方法:

C#

myEffect.Parameters["ModelTexture"].SetValue(woodTexture);

采样器有什么用?没有EffectParameter.SetValue(SamplerState)重载,但我想在运行时更改过滤器。我该怎么做呢?

我非常确定其余的代码是正常的,因为如果我直接在HLSL中初始化TextureSampler,它会正确地绘制纹理对象。

编辑:

我尝试在GraphicsDevice中设置SamplerState对象。

C#

GraphicsDevice.SamplerStates[0] = new SamplerState { Filter = TextureFilter.Linear };

HLSL

sampler2D TextureSampler : register(s0);

现在,纹理分配(请参阅第二个代码段)会抛出NullReferenceException

我也尝试过设置上面的纹理,而不是通过EffectParameter

C#

GraphicsDevice.Textures[0] = woodTexture;

HLSL

texture ModelTexture : register(t0);

程序编译并运行但未加载纹理(渲染对象为黑色)。

2 个答案:

答案 0 :(得分:0)

很长一段时间我没有使用XNA框架,但通过在Google中进行简单搜索,我得到了这样的结果:

What Is Sampler State?

采样器状态确定如何使用纹理寻址模式,过滤和细节级别对纹理数据进行采样。使用SamplerState类创建一个采样器状态对象。使用GraphicsDevice.SamplerStates属性将采样器状态设置为图形设备。

GraphicsDevice.SamplerStates Property

此方法返回为GraphicsDevice设置的最后一个采样器状态,或者返回默认的GraphicsDevice采样器状态(如果之前未设置)。可编程着色器使用采样器编号引用纹理,该编号设置为GraphicsDevice.Textures的索引。

因此,您必须创建一个SamplerState对象并将其设置在GraphicsDevice.SamplerStates插槽之一。

答案 1 :(得分:0)

采样器状态在图形设备对象上或着色器本身内设置。