C# XNA着色器矩阵参数已损坏
我在XNA4.0中使用模型实例,并以并行流的形式发送模型实例转换。我正在学习教程。然而,当我想要一个矩阵作为着色器的输入时,我会得到一个看起来像是损坏的矩阵的东西,因为我会得到奇怪的投影结果 有人知道问题的根源吗?当别人建议时,为什么我不能通过矩阵 问题: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;
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#
矩阵中的正确值最终位于HLSLfloat4x4
中的正确位置。我怀疑映射是微不足道的,但我不确定。以下是我在项目中使用的代码
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);