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

imported>Administrator
編集の要約なし
 
編集の要約なし
 
(同じ利用者による、間の7版が非表示)
1行目: 1行目:
[[ハードウェアインスタンシング]]を利用するにあたりMatrix型の[[World座標]]を渡したい。
[[ハードウェアインスタンシング]]を利用するにあたり[[C♯]]から[[HLSL]]にMatrix型の[[World座標]][[バーテックスバッファ]]経由で渡したい。
つまり[[C♯]]から[[HLSL]]にMatrix型を渡せると嬉しい。


しかし[[HLSL]]に渡すデータ型を示すVertexElementFormatは「Vector4」が最大となっている。
しかしMonoGameから[[HLSL]]に渡す際にデータ型を明示するVertexElementFormatは「Vector4」が最大となっている。Matrix型はない。
Matrixは渡せない。


そこでMatrixはfloat4x4であり単純に4倍と仮定してVector4を4個ズラズラ列べる。
そこで「MatrixはVector4が4個セットになったもの」と仮定してVector4を4個ズラズラ列べてみる。VertexElementUsageはfloat4型のセマンティクス、かつ誰も使ってないであろうBlendWeightを指定した。
VertexElementUsageはfloat4型のセマンティクス、かつ誰も使ってないであろうBlendWeightを指定した。


<syntaxhighlight lang="csharp">
<syntaxhighlight lang="csharp">
18行目: 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));


// ダイナミックバーテックスバッファーを生成する
// ダイナミックバーテックスバッファーを生成する
34行目: 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;
}
}