Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xna 在HLSL中改变纹理 float4x4wvp; 纹理立方结构; 采样器纹理采样器=采样器状态 { 纹理=; MipFilter=点; 磁过滤器=点; MinFilter=点; 地址u=包裹; 地址v=包裹; 最大各向异性=16; };_Xna_Textures - Fatal编程技术网

Xna 在HLSL中改变纹理 float4x4wvp; 纹理立方结构; 采样器纹理采样器=采样器状态 { 纹理=; MipFilter=点; 磁过滤器=点; MinFilter=点; 地址u=包裹; 地址v=包裹; 最大各向异性=16; };

Xna 在HLSL中改变纹理 float4x4wvp; 纹理立方结构; 采样器纹理采样器=采样器状态 { 纹理=; MipFilter=点; 磁过滤器=点; MinFilter=点; 地址u=包裹; 地址v=包裹; 最大各向异性=16; };,xna,textures,Xna,Textures,如果我没弄错的话,这会告诉采样器状态我使用的纹理。 我对许多精灵使用一个效果文件,因为这允许我使用一个纹理(atlas)。 我可以把我所有的纹理地图集合并成一个爷爷地图集,但我担心会有麻烦 有没有办法告诉像素着色器通过其参数使用特定纹理? 我是HLSL的新手,这让我很困惑。如果你给你的着色器一个引用寄存器的语义,就像这样 float4x4 WVP; texture cubeTexture; sampler TextureSampler = sampler_state { texture = &

如果我没弄错的话,这会告诉采样器状态我使用的纹理。 我对许多精灵使用一个效果文件,因为这允许我使用一个纹理(atlas)。 我可以把我所有的纹理地图集合并成一个爷爷地图集,但我担心会有麻烦

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

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

float4x4 WVP;
texture cubeTexture;

sampler TextureSampler = sampler_state
{
texture = <cubeTexture>;
MipFilter = Point;
MagFilter = Point;
MinFilter = Point;
AddressU = Wrap;
AddressV = Wrap;
MaxAnisotropy = 16;
};
然后,您可以使用游戏代码中的
GraphicsDevice.Textures
属性在代码中指定纹理

// HLSL
sampler TextureSampler : register(s1);
/C#
Texture2D Texture2D=Content.Load(“contentfile”);
graphicsDevice.Textures[1]=texture2D;

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

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

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

这并不是最优的,因为它会使纹理采样的数量增加4倍,但它可能会起作用,这取决于具体情况

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

谢谢你们的回答,伙计们,我仍然对HSL感到困惑,但我会弄明白的。我最终做的是实例化原语,为每个精灵表创建“批次”,并在原语上绘制我想要的任何精灵,这样我就可以在任何地方绘制大量的对象,而不需要复杂化。
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;