使用 HLSL 设置纹理地址模式

本文关键字:地址 模式 纹理 设置 HLSL 使用 | 更新日期: 2023-09-27 18:35:45

我一直在使用不是我自己编写的着色器在 XNA 中实现照明系统,我遇到了一个问题:如果游戏的尺寸是 2 的幂(现在它以 1024x512 运行),系统可以完美运行,否则会在行GraphicsDevice.DrawUserPrimitives(PrimitiveType.TriangleStrip, Vertices, 0, 2);处崩溃,抛出一个异常,指出"当使用不是 2 的幂的纹理大小时,XNA Framework Reach 配置文件要求 TextureAddressMode 是 Clamp。

在互联网搜索中,最常见的解决方案是将GraphicsDevice.SamplerStates[0] = SamplerState.LinearClamp行直接放在上面的行上方。 我试过这个,但没有效果。 事实上,在我试图梳理出解决方案的过程中,在我用该行设置它之前,GraphicsDevice.SamplerStates[0]似乎是空的,这让我相信这个问题也可以通过选择它作为活动采样器状态来解决——尽管我也不确定该怎么做。

否则,根据我找到的其他信息,我认为我需要从着色器中设置 TextureAddressMode。 我被定向到此页面以获取有关如何执行此操作的信息,但我承认仍然感到困惑 - 我以前从未使用过HLSL,并且我不确定如何使用该页面上的信息。

如果我需要提供更多的信息,我非常乐意这样做,我首先问了一个问题,这个问题让我想到了现在的问题。

使用 HLSL 设置纹理地址模式

在 HLSL 中查找声明像素着色器正在使用的采样器的行。

您可以将地址模式设置为夹在此行中。

SamplerState somethingLikeThis {
    Filter = MIN_MAG_MIP_LINEAR;
    AddressU = Clamp;
    AddressV = Clamp;
};