「MonoGameでHLSLにMatrixを渡す」の版間の差分

編集の要約なし
編集の要約なし
 
(同じ利用者による、間の3版が非表示)
15行目: 15行目:
// 仕方がないので「Vector4が4個」と指定する。
// 仕方がないので「Vector4が4個」と指定する。
var vertexDeclaration = new VertexDeclaration(
var vertexDeclaration = new VertexDeclaration(
        new VertexElement( 0, VertexElementFormat.Vector4, VertexElementUsage.BlendWeight, 0),
    new VertexElement( 0, VertexElementFormat.Vector4, VertexElementUsage.BlendWeight, 0),
        new VertexElement(16, VertexElementFormat.Vector4, VertexElementUsage.BlendWeight, 1),
    new VertexElement(16, VertexElementFormat.Vector4, VertexElementUsage.BlendWeight, 1),
        new VertexElement(32, VertexElementFormat.Vector4, VertexElementUsage.BlendWeight, 2),
    new VertexElement(32, VertexElementFormat.Vector4, VertexElementUsage.BlendWeight, 2),
        new VertexElement(48, VertexElementFormat.Vector4, VertexElementUsage.BlendWeight, 3));
    new VertexElement(48, VertexElementFormat.Vector4, VertexElementUsage.BlendWeight, 3));


// ダイナミックバーテックスバッファーを生成する
// ダイナミックバーテックスバッファーを生成する
31行目: 31行目:
</syntaxhighlight>
</syntaxhighlight>


HLSL側はfloat4が4個で受け取り、シェーダー関数内でmatrixに合成している。
HLSL側は「float4が4個」として受け取り、[[バーテックスシェーダー]]内でmatrixに合成している。
<syntaxhighlight lang="hlsl">
<syntaxhighlight lang="hlsl">
// 「float4が4個」として受け取る。
// 「float4が4個」として受け取る。
struct InstanceInput
struct VSInstance
{
{
float4 w1 : BLENDWEIGHT0;
    float4 w1 : BLENDWEIGHT0;
float4 w2 : BLENDWEIGHT1;
    float4 w2 : BLENDWEIGHT1;
float4 w3 : BLENDWEIGHT2;
    float4 w3 : BLENDWEIGHT2;
float4 w4 : BLENDWEIGHT3;
    float4 w4 : BLENDWEIGHT3;
};
};


VertexShaderOutput MainVS(VertexShaderInput input, InstanceInput instance)
VSOutput VSMain(VSInput input, VSInstance instance)
{
{
     VertexShaderOutput output = (VertexShaderOutput)0;
     VSOutput output = (VSOutput)0;


// 「float4が4個」をmatrixに変換する。
    // 「float4が4個」をmatrixに合成する。
matrix world = matrix(instance.w1, instance.w2, instance.w3, instance.w4);
    matrix world = matrix(instance.w1, instance.w2, instance.w3, instance.w4);


     // 〜以下略〜
     // 〜以下略〜
     return output;
     return output;
}
}