XNA 中的自定义内容管道,如何手动设置漫反射纹理?
Posted
技术标签:
【中文标题】XNA 中的自定义内容管道,如何手动设置漫反射纹理?【英文标题】:Custom content pipelines in XNA, how to set diffuse textures manually? 【发布时间】:2011-11-14 00:01:47 【问题描述】:XNA 是蜜蜂的膝盖,但我仍然无法完全围绕自定义内容管道。
一些基本示例(例如 MSDN 的法线贴图示例)向您展示了如何将法线贴图键从 .fbx 文件中的不透明数据分配到要加载的适当法线贴图纹理。我什至不知道他们是如何知道密钥应该命名的,实际上是什么不透明数据,是否在 .fbx 文件中定义。
有趣的是,内容管道中没有代码说明如何设置漫反射纹理 - 这似乎暗示您使用名为“Texture”的阴影参数并且它们会自动设置。但是,如果我将参数重命名为其他名称,则模型加载时没有纹理。
它如何隐式知道加载漫反射纹理,例如,我如何加载漫反射纹理以使用不同命名的着色器参数读取并加载默认的中性白色纹理文件(如果不存在)?
就此而言,是否有学习使用内容管道自定义加载模型的“hello world”示例?
请注意,我不希望通过在属性窗口中设置纹理来覆盖 .fbx 模型中现有的纹理引用。
【问题讨论】:
【参考方案1】:首先要了解的是,XNA 允许创建两个单独的自定义内容管道项:一个是导入器,另一个是处理器。
当你编写一个导入器时,你可以按照你想要的方式解析任何文件,并将你想要的信息存储到你指定的任何类(对象)中。您可以自己编写类或在 XNA 中使用某些类。以这种方式,您可以简单地编写一个导入器,从文件中获取数据,并使用内置的 ModelProcessor 将其转换为 XNA 模型类对象。
这是一个自定义模型导入器的示例:
http://create.msdn.com/en-US/education/catalog/sample/custom_model_importer
如果您需要模型以外的其他对象,请编写自定义处理器:
处理器获取导入器指定的类对象并将其转换为另一个类(因为您正在编写它,任何类和您指定的任何方式)。此类用于生成 .xnb 文件(XNA 二进制文件),您的游戏会在运行时读取该文件。因此,所有这些都只在编译期间运行,以便让您更好地控制游戏内容。
这是一个很好的入门链接:
http://msdn.microsoft.com/en-us/library/bb447754(v=xnagamestudio.20).aspx
对于您的情况,您似乎对默认 FBX 导入器的行为不满意。如果是这种情况,您很可能必须自己编写。不过,您很可能不需要编写自己的处理器;将 ModelProcessor 指定为默认值,就像我第一个链接中的项目所做的那样。
【讨论】:
感谢您的回答。我想知道同样的事情,因为我看到的很多例子似乎只做了看起来必要的一半——现在我知道为什么了。这为我节省了一些研究时间。 我想这也意味着要非常熟悉自定义导入器/处理器类扩展的基类。我查看了第一个链接,该示例很简单,特别是因为我过去已经编写了一个 OBJ 导入器(猜测 FBX 格式是挑战)。我什至改进了它,使它可以将任何四边形转换为三角形。以上是关于XNA 中的自定义内容管道,如何手动设置漫反射纹理?的主要内容,如果未能解决你的问题,请参考以下文章
Unity Shaders学习笔记——SurfaceShader用纹理改善漫反射