2011-04-13 90 views
2

我正在編寫我的第一個着色器,通常寫一個着色器來完成功能,因爲我意識到主要的XNA庫不支持它們。HLSL:處理缺少TexCoords?

我遇到的麻煩是,並非我所有的模型在特定場景中都有紋理數據,我無法弄清楚如何處理它。主要XNA庫似乎通過使用BasicEffect的包裝類來處理它,通過內容管理器加載它並相應地選擇性地啓用或禁用紋理處理。

要完成自定義着色器的難度有多大?我正在寫的是一種通用的「色調轉換」效果,也就是說,我希望使用這種技術繪製其紋理顏色(如果有的話)以及其頂點顏色色調在一定程度上偏移。我是否需要編寫單獨的着色器,一個是紋理,另一個是沒有?如果是這樣,當我通過MeshParts循環時,是否有任何方法檢測給定部分是否具有紋理座標,以便我可以應用正確的效果?

+0

哎呀,對不起。^_ ^習慣來自論壇。 – 2011-04-13 07:42:30

回答

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。如果設置了Texture,則簡單地打開BasicEffect.TextureEnabled屬性。