【发布时间】:2012-09-23 01:00:39
【问题描述】:
我刚刚进入 XNA 编程,一直无法弄清楚如何从“.x”模型访问纹理。我正在使用自定义着色器来显示我的模型(只是一个贴有纹理的立方体),过滤器设置为点。为此,我需要传递需要与模型分开导入的纹理文件的效果,否则它会抱怨,因为它也包含在我的模型中。这完全符合我的要求,但是当我有许多具有自己纹理的不同模型时,这并不是一个真正令人满意的方法。
我的问题是:
我如何能够直接从中访问模型中包含的纹理并将其发送到我的着色器?或者我可以直接使用 HLSL 访问它吗?
我尝试过的:
我发现帖子说它可以分配给纹理变量:
Texture2d texture = ((BasicEffect)model.Meshes[0].Effects[0]).Texture
当我尝试这个时,游戏运行但立方体只是黑色的。我可以看到纹理变量保存了信息并且具有正确的尺寸,但我无法判断它是否正确保存了实际图像。当我只使用BasicEffect 时,它们的纹理渲染得很好。
更新:
经过一番摆弄,我已经设法让它工作了。我的游戏加载了数百个相同的立方体,在创建每个立方体后,它会尝试使用上面的代码保存模型的纹理,然后遍历网格部分并将效果更改为我的自定义效果。我发现创建的第一个立方体可以很好地保存纹理,但是任何后续创建的立方体都会抱怨它们不能被转换为 BasicEffect。这导致了一个带纹理的立方体,然后是很多黑色的。我猜想当它像这样一遍又一遍地重复使用相同的模型时,它只会使用修改后的模型以使用我在多维数据集的第一个实例上完成的自定义效果。这是正常的吗?通过将纹理变量更改为静态,我已将它们全部渲染为纹理。
【问题讨论】:
-
---我可以看到纹理变量保存了信息并且具有正确的尺寸---用 spritebatch 绘制纹理以查看是否保存图像信息。如果是这样,那么问题可能出在您的自定义 hlsl 中。发布该代码可能会有所帮助。