【问题标题】:Changing texture in HLSL更改 HLSL 中的纹理
【发布时间】:2013-02-01 21:00:00
【问题描述】:
float4x4 WVP;
texture cubeTexture;

sampler TextureSampler = sampler_state
{
texture = <cubeTexture>;
MipFilter = Point;
MagFilter = Point;
MinFilter = Point;
AddressU = Wrap;
AddressV = Wrap;
MaxAnisotropy = 16;
};

所以如果我没记错的话,这会告诉采样器说明我正在使用什么纹理。 我为许多精灵使用一个效果文件,因此这允许我使用一种纹理(图集)。 而且我可以将我所有的纹理图集组合成一个爷爷图集,但我担心会出现并发症。

有没有办法通过参数告诉像素着色器使用某个纹理? 我是 HLSL 的新手,这让我很困惑。

【问题讨论】:

标签: xna textures


【解决方案1】:

如果你给你的着色器一个语义来引用一个寄存器,像这样

// HLSL
sampler TextureSampler : register(s1);

然后您可以使用游戏代码中的GraphicsDevice.Textures 属性在代码中分配纹理

// C#
Texture2D texture2D = Content.Load<Texture2D>("contentfile");
graphicsDevice.Textures[1] = texture2D;

我使用寄存器 1 而不是 0,因为 Spritebatch.Draw() 中的纹理参数使用寄存器 0。如果您不是 spritebatching,请随意使用寄存器 0;

【讨论】:

  • 我最终做的是实例化基元,并为每个精灵表设置“批次”,然后将我想要的任何精灵绘制到一个基元上,这样我就可以在任何地方绘制大量对象而不会出现复杂情况
【解决方案2】:

您可以编写一个包含多个纹理和采样器的着色器,但这不是很有效。纹理图集更可取,因为它更容易避免分支。

我建议,对于使用 4 种不同的纹理,在每个顶点上都有一个额外的颜色,其中颜色的每个部分 (r,g,b,a) 可用于混合纹理。然后,您将在 C# 中设置这个额外颜色的值,并在着色器中使用它。

这不是最优的,因为它会执行 4 * 纹理采样数,但它可能会起到作用,具体取决于具体情况。

var c1 = Tex2D(texture1, texcoords) * extracolor.r;
var c2 = Tex2D(texture2, texcoords) * extracolor.g;
var c3 = Tex2D(texture3, texcoords) * extracolor.b;
var c4 = Tex2D(texture4, texcoords) * extracolor.a;

output.color = c1 + c2 + c3 + c4;

【讨论】:

  • 感谢大家的回答,我仍然对 hsls 感到困惑,但我会弄清楚的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-19
  • 2013-11-23
相关资源
最近更新 更多