C# XNA着色器矩阵参数已损坏

C# XNA着色器矩阵参数已损坏,c#,xna-4.0,hlsl,C#,Xna 4.0,Hlsl,我在XNA4.0中使用模型实例,并以并行流的形式发送模型实例转换。我正在学习教程。然而,当我想要一个矩阵作为着色器的输入时,我会得到一个看起来像是损坏的矩阵的东西,因为我会得到奇怪的投影结果 有人知道问题的根源吗?当别人建议时,为什么我不能通过矩阵 问题: struct VertexShaderInput { float4 Position : POSITION0; float3 Normal : NORMAL0; float3 UV : TEXCOORD0;

我在XNA4.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)
        );
    }

GPU上的输入寄存器大小有限。
TEXCOORDn
的大小为
float4
(如清单所示)。没有
float4x4
输入


在多个输入寄存器之间拆分矩阵,然后重建它应该可以正常工作。只需确保C#
矩阵中的正确值最终位于HLSL
float4x4
中的正确位置。我怀疑映射是微不足道的,但我不确定。

以下是我在项目中使用的代码

 public Instance(Instancer instancer, float scale, Vector3 translate, Vector3 information)
    {
        ID++;
        id = ID;
        this.Scale(scale); 
        this.Translate(translate);
        this.Update(); //update the model matrix modelMatrix=scale*rotate*translate ma!

        Instancer = instancer;

        modelMatrix.M12 = information.X; //additional info unique for each instance
        modelMatrix.M23 = information.Y;
        modelMatrix.M34 = information.Z;
        Instancer.instanceTransformMatrices.Add(this, ModelMatrix);
    }
每个实例的模型矩阵

  protected static VertexDeclaration instanceVertexDeclaration = new VertexDeclaration
    (
        new VertexElement(0, VertexElementFormat.Vector4, VertexElementUsage.BlendWeight, 0),
        new VertexElement(16, VertexElementFormat.Vector4, VertexElementUsage.BlendWeight, 1),
        new VertexElement(32, VertexElementFormat.Vector4, VertexElementUsage.BlendWeight, 2),
        new VertexElement(48, VertexElementFormat.Vector4, VertexElementUsage.BlendWeight, 3)
    );
vbo的矩阵列表,其中modelVertexBuffer是四元或任何其他几何体

instanceVertexBuffer = new DynamicVertexBuffer(BaseClass.Device, instanceVertexDeclaration, instanceTransformMatrices.Count, BufferUsage.WriteOnly);
            instanceVertexBuffer.SetData(instanceTransformMatrices.Values.ToArray(), 0, instanceTransformMatrices.Count, SetDataOptions.Discard);
绘图函数

BaseClass.Device.SetVertexBuffers(
                       new VertexBufferBinding(modelVertexBuffer, 0, 0),
                       new VertexBufferBinding(instanceVertexBuffer, 0, 1)
                   );

BaseClass.Device.Indices = indexBuffer;
BaseClass.Device.DrawInstancedPrimitives(PrimitiveType.TriangleList, 0, 0,modelVertexBuffer.VertexCount, 0,2,instanceTransformMatrices.Count);
采样顶点着色器

 VertexOut VS(VertexIn input, float4x4 instanceTransform : BLENDWEIGHT)
 {
    VertexOut Out = (VertexOut)0;

  float4x4 world = transpose(instanceTransform);
  input.Position.xyz = float3(world._41,world._42,world._43);