C# XNA-如何从.x模型访问纹理?

C# XNA-如何从.x模型访问纹理?,c#,xna,hlsl,.x,C#,Xna,Hlsl,.x,我刚刚开始学习XNA编程,一直不知道如何从“.x”模型访问纹理。我正在使用一个自定义着色器来显示我的模型(只是一个带有纹理映射的立方体),并将过滤器设置为“点”。要做到这一点,我需要将效果传递给我的纹理文件,该文件需要从我的模型中单独导入,否则它会抱怨,因为它也包含在我的模型中。这完全符合我的要求,但是,当我有许多不同的模型和它们自己的纹理时,这并不是一个令人满意的方法 我的问题是: 如何直接从模型中访问包含在模型中的纹理并将其发送到着色器?或者我可以通过HLSL直接访问它吗 我尝试过的: 我发

我刚刚开始学习XNA编程,一直不知道如何从“.x”模型访问纹理。我正在使用一个自定义着色器来显示我的模型(只是一个带有纹理映射的立方体),并将过滤器设置为“点”。要做到这一点,我需要将效果传递给我的纹理文件,该文件需要从我的模型中单独导入,否则它会抱怨,因为它也包含在我的模型中。这完全符合我的要求,但是,当我有许多不同的模型和它们自己的纹理时,这并不是一个令人满意的方法

我的问题是:

如何直接从模型中访问包含在模型中的纹理并将其发送到着色器?或者我可以通过HLSL直接访问它吗

我尝试过的:

我发现有帖子说它可以通过以下方式分配给纹理变量:

Texture2d纹理=((基本效果)模型。网格[0]。效果[0])。纹理

当我尝试这个游戏运行,但立方体只是黑色的。我可以看到纹理变量包含信息,并且具有正确的尺寸,但我无法判断它是否正确包含实际图像。当我只使用
BasicEffect
时,它们的纹理渲染得很好

更新:


在做了一点小动作后,我成功地使它起作用了。我的游戏加载了几百个相同的立方体,在创建每个立方体时,它会尝试使用上面的代码保存模型的纹理,然后遍历网格部分并将效果更改为我的自定义效果。我发现创建的第一个立方体可以保存纹理,但是任何后续创建的立方体都会抱怨它们不能被转换为基本效果。这导致了一个纹理立方体,然后是许多黑色立方体。我猜,当它像那样反复重用同一个模型时,它只会使用经过修改的模型,以使用我在多维数据集的第一个实例上完成的自定义效果。这正常吗?通过将纹理变量更改为静态,我已将它们全部渲染为纹理。

请注意,您正在将模型的纹理指定给临时纹理2D变量,而不是设置当前绑定到网格的效果中存在的纹理。 如果您执行以下操作:

Texture2D textureToSet = Content.Load<Texture2D>("MyTex");

//Keep in mind that this method requires a basic effect type and that only one 
//effect is present on each mesh to work properly.
foreach(Mesh mesh in model.Meshes)
{
    ((BasicEffect)(mesh.Effects[0])).Texture = textureToSet;
}
Texture2D textureToSet=Content.Load(“MyTex”);
//请记住,此方法需要一个基本效果类型,并且只有一个
//每个网格上都会出现此效果,以便正常工作。
foreach(model.Mesh中的网格)
{
((基本效果)(网格效果[0])。纹理=纹理集;
}

foreach内部的诡异之处在于,你只是抓住了效果,然后将其铸造成一个基本效果,并使用其纹理属性赋予它一个新的纹理,以便在使用时绘制。有关更详细的介绍,请参见和。

如果其他人在我保存纹理时对此感到疑惑,请使用:

Texture2d texture = ((BasicEffect)model.Meshes[0].Effects[0]).Texture
这确实有效,但有一件事需要注意,那就是是什么导致了我的问题。如果对一个实例从默认的基本效果更改模型的效果,则随后创建的模型的每个实例的效果都将更改。因此,在第一次对特定模型更改效果之前,只能使用上述代码


后来我找到了这本书,它准确地描述了如何从模型中提取纹理和其他信息:Sean James的XNA Game Studio 4.0 3D Graphics-特别是第2章-我可以看到纹理变量包含信息并且具有正确的尺寸-使用spritebatch绘制纹理,以查看是否包含图像信息。如果是这样,那么问题可能出在您的自定义hlsl中。发布该代码可能会有所帮助。谢谢您的建议。然而,我希望做相反的事情,从基本效果中提取纹理,并在我自己的效果中使用它。(不使用Content.Load)然后简单地执行相反的操作?Texture2D toExtract=((基本效果)(网格效果[0])。纹理?正如我在我的问题中所说的,这就是我所尝试的,但它给我带来了问题。