假设我在着色器中有这两个变量:
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);
程序编译并运行但未加载纹理(渲染对象为黑色)。
答案 0 :(得分:0)
很长一段时间我没有使用XNA框架,但通过在Google中进行简单搜索,我得到了这样的结果:
采样器状态确定如何使用纹理寻址模式,过滤和细节级别对纹理数据进行采样。使用SamplerState类创建一个采样器状态对象。使用GraphicsDevice.SamplerStates属性将采样器状态设置为图形设备。
GraphicsDevice.SamplerStates Property
此方法返回为GraphicsDevice设置的最后一个采样器状态,或者返回默认的GraphicsDevice采样器状态(如果之前未设置)。可编程着色器使用采样器编号引用纹理,该编号设置为GraphicsDevice.Textures的索引。
因此,您必须创建一个SamplerState对象并将其设置在GraphicsDevice.SamplerStates插槽之一。
答案 1 :(得分:0)
采样器状态在图形设备对象上或着色器本身内设置。