HLSL:处理缺少TexCoords?

时间:2011-04-13 06:47:20

标签: xna hlsl

我正在编写我的前几个着色器,通常编写着色器来完成功能,因为我意识到主XNA库不支持它们。

我遇到的麻烦是,并非特定场景中的所有模型都有纹理数据,我无法弄清楚如何处理它。主要的XNA库似乎通过使用BasicEffect的包装类来处理它,通过内容管理器加载它并相应地选择性地启用或禁用纹理处理。

为自定义着色器完成此操作有多难?我正在写的是一种通用的“色调偏移”效果,也就是说,我希望用这种技术绘制的任何东西都有其纹理颜色(如果有的话),并且它的顶点颜色色调会移动一定程度。我是否需要编写单独的着色器,一个具有纹理而另一个没有?如果是这样,当我循环浏览我的MeshParts时,有没有办法检测给定的部分是否有纹理坐标,以便我可以应用正确的效果?

1 个答案:

答案 0 :(得分:3)

是的,您需要单独的着色器,或者更确切地说是不同的“技术” - 它仍然可以使用相同的效果并使用大部分相同的代码。您可以看到BasicEffect(至少是XNA 4.0之前的版本)如何做by reading the source code

要检测模型网格零件是否具有纹理坐标,请尝试以下操作:

// Note: this allocates an array, so do it at load-time
var elements = meshPart.VertexBuffer.VertexDeclaration.GetVertexElements();
bool result = elements.Any(e => 
        e.VertexElementUsage == VertexElementUsage.TextureCoordinate);

内容管道设置其BasicEffect的方式是通过BasicMaterialContent。如果设置了BasicEffect.TextureEnabled,则只会启用Texture属性。