XNA 4.0でモデルインスタンス化を使用していて、モデルインスタンス変換を並列ストリームで送信しています。このチュートリアルに従っています。ただし、シェーダーへの入力として行列が必要な場合、奇妙な投影結果が得られるため、破損した行列のように見えます。
誰かが問題の原因を知っていますか、そして他の人がそう提案したときになぜ私がマトリックスを渡すことができないのですか?
問題:
struct VertexShaderInput
{
float4 Position : POSITION0;
float3 Normal : NORMAL0;
float3 UV : TEXCOORD0;
float3 Color : COLOR0;
float3 Tangent : TANGENT0;
float3 Binormal : BINORMAL0;
float4x4 World : TEXCOORD3; //Problem
};
頂点シェーダー関数を次のように変更しても、どちらも役に立ちません。
VertexShaderOutput VertexShaderFunction(VertexShaderInput input, float4x4 World : TEXCOORD3)
{
}
これは、ベクトルだけで行列を作成する場合に機能しますが、理由はわかりません。私はデータを失っていますか?
struct VertexShaderInput
{
float4 Position : POSITION0;
float3 Normal : NORMAL0;
float3 UV : TEXCOORD0;
float3 Color : COLOR0;
float3 Tangent : TANGENT0;
float3 Binormal : BINORMAL0;
float4 World1 : TEXCOORD3;
float4 World2 : TEXCOORD4;
float4 World3 : TEXCOORD5;
float4 World4 : TEXCOORD6;
};
頂点形式:
internal struct InstanceDataVertex
{
public Matrix World;
public InstanceDataVertex(Matrix World)
{
this.World = World;
}
public readonly static VertexDeclaration VertexDeclaration = new VertexDeclaration
(
new VertexElement(0, VertexElementFormat.Vector4, VertexElementUsage.TextureCoordinate, 3),
new VertexElement(sizeof(float) * 4, VertexElementFormat.Vector4, VertexElementUsage.TextureCoordinate, 4),
new VertexElement(sizeof(float) * 8, VertexElementFormat.Vector4, VertexElementUsage.TextureCoordinate, 5),
new VertexElement(sizeof(float) * 12, VertexElementFormat.Vector4, VertexElementUsage.TextureCoordinate, 6)
);
}