這是一個老問題,但我有,所以我想我會發佈一個後續昨天這出自己:如果您使用的是默認FBX內容處理器
,並有DefaultEffect
屬性設置爲BasicEffect
,您可以通過獲得Texture2D
的對象:
texture = ((BasicEffect)model.Meshes[0].Effects[0]).Texture;
注意,在模型中的每個網格可以有不同的質感。
紋理座標存儲在MeshPart
的VertexBuffer
以及位置等我見過兩個頂點聲明。對於使用單個紋理的模型/網格(3DS Max中的位圖材質),頂點聲明爲VertexPositionNormalTexture
。
對於有兩個紋理(位圖和不透明/α-地圖)的模型,聲明有元素:
Position
Normal
Texture (usage index 0)
Texture (usage index 1)
,或者裹入IVertexType
結構,
public struct VertexPositionNormalTextureTexture : IVertexType
{
public Vector3 Position;
public Vector3 Normal;
public Vector4 Texture0;
public Vector4 Texture1;
public static VertexDeclaration VertexDeclaration
{
get
{
return new VertexDeclaration
(
new VertexElement(0,VertexElementFormat.Vector3, VertexElementUsage.Position, 0)
,
new VertexElement(0,VertexElementFormat.Vector3, VertexElementUsage.Normal, 0)
,
new VertexElement(0,VertexElementFormat.Vector3, VertexElementUsage.TextureCoordinate, 0)
,
new VertexElement(0,VertexElementFormat.Vector3, VertexElementUsage.TextureCoordinate, 1)
);
}
}
VertexDeclaration IVertexType.VertexDeclaration
{
get { return VertexDeclaration; }
}
}
和等效HLSL結構:
struct VertexPositionNormalTextureTexture
{
float3 Position : POSITION0;
float3 Normal : NORMAL0;
float4 Texture0 : TEXCOORD0;
float4 Texture1 : TEXCOORD1;
};
請注意,我更改了.Position
和.Normal
從Vector4
和Vector3
到float4
和float3
之前我發佈了這個,並沒有測試它。可能需要將它們更改回Vector4
和float4
。
當然,您需要在像素着色器中使用一個採樣器和一些基本邏輯來讀取每個紋理。假設您設定了兩種效果參數xTexture0和xTexture1到包含顏色紋理和透明度地圖Texture2D
對象,
// texture sampler
sampler Sampler0 = sampler_state
{
Texture = (xTexture0);
};
sampler Sampler1 = sampler_state
{
Texture = (xTexture1);
};
,這裏是一個簡單的雙紋理像素着色器。如果你只想要一個紋理,只是從第一採樣讀取和返回值,或應用照明等
float4 TwoTexturePixelShader(VertexPositionNormalTextureTexture input) : COLOR0
{
float4 texel0;
float4 texel1;
float4 pixel;
// check global effect parameter to see if we want textures turned on
// (useful for debugging geometry weirdness)
if (TexturesEnabled)
{
texel0 = tex2D(Sampler0, input.Texture0);
texel1 = tex2D(Sampler1, input.Texture1);
/// Assume texel1 is an alpha map, so just multiple texel0 by that alpha.
pixel.rgb=texel0.rgb;
pixel.a=texel0.a;
}
else
/// return 100% green
pixel = float4(0,1,0,1);
return pixel;
}
相關穴位這裏有紋理座標在FBX已經存在和已經存儲在每個MeshPart
的VertexBuffer
中,所有您需要做的就是提取紋理,並將其作爲全局效果參數傳遞到着色器,然後按正常方式繼續。
這是您用來從FBX文件中的3DS max重現效果的過程嗎? – 2010-01-04 21:14:41
是的,它是...... – 2010-01-05 14:12:30
(萬一任何人遇到這種情況並需要它)GS 3.1的皮膚效應樣本(在他們引入股票SkinnedEffect之前)[http://create.msdn.com/en- US/education/catalog/sample/skinned_model]顯示瞭如何在設計時加載自定義着色器的BasicEffect。 (ConvertMaterial方法) – sebf 2011-02-16 23:12:53