Xna HLSL:处理缺乏TexCoords的问题?

Xna HLSL:处理缺乏TexCoords的问题?,xna,hlsl,Xna,Hlsl,我正在编写我的前几个着色器,通常编写一个着色器来完成功能,因为我意识到主XNA库不支持它们 我遇到的问题是,并非我在特定场景中的所有模型都包含纹理数据,我不知道如何处理这些数据。主XNA库似乎通过使用BasicFect的包装类来处理它,通过content manager加载它,并相应地有选择地启用或禁用纹理处理 对于自定义着色器,完成此操作有多困难?我写的是一个通用的“色调偏移”效果,也就是说,我希望用这种技术绘制的任何东西都有其纹理颜色(如果有的话)和顶点颜色色调偏移一定程度。我是否需要编写单

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

我遇到的问题是,并非我在特定场景中的所有模型都包含纹理数据,我不知道如何处理这些数据。主XNA库似乎通过使用BasicFect的包装类来处理它,通过content manager加载它,并相应地有选择地启用或禁用纹理处理


对于自定义着色器,完成此操作有多困难?我写的是一个通用的“色调偏移”效果,也就是说,我希望用这种技术绘制的任何东西都有其纹理颜色(如果有的话)和顶点颜色色调偏移一定程度。我是否需要编写单独的着色器,一个有纹理,一个没有纹理?如果是这样,当我在网格零件中循环时,是否有任何方法可以检测给定零件是否具有纹理坐标,以便我可以应用正确的效果?

是的,您将需要单独的着色器,或者更确切地说是不同的“技术”-它仍然可以是相同的效果并使用相同的代码。您可以看到
basicefect
(至少是XNA 4.0之前的版本)是如何做到这一点的

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

// 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);

内容管道设置其
basicfect
的方式是通过
BasicMaterialContent
。如果设置了
Texture
,则只需打开
BasicEffect.TextureEnabled
属性

哎呀,很抱歉来自论坛的习惯。