我正在编写我的前几个着色器,通常编写着色器来完成功能,因为我意识到主XNA库不支持它们。
我遇到的麻烦是,并非特定场景中的所有模型都有纹理数据,我无法弄清楚如何处理它。主要的XNA库似乎通过使用BasicEffect的包装类来处理它,通过内容管理器加载它并相应地选择性地启用或禁用纹理处理。
为自定义着色器完成此操作有多难?我正在写的是一种通用的“色调偏移”效果,也就是说,我希望用这种技术绘制的任何东西都有其纹理颜色(如果有的话),并且它的顶点颜色色调会移动一定程度。我是否需要编写单独的着色器,一个具有纹理而另一个没有?如果是这样,当我循环浏览我的MeshParts时,有没有办法检测给定的部分是否有纹理坐标,以便我可以应用正确的效果?
答案 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
属性。