「MonoGameでHLSLにMatrixを渡す」の版間の差分
imported>Administrator 編集の要約なし |
Administrator (トーク | 投稿記録) 編集の要約なし |
||
| (同じ利用者による、間の7版が非表示) | |||
| 1行目: | 1行目: | ||
[[ハードウェアインスタンシング]] | [[ハードウェアインスタンシング]]を利用するにあたり[[C♯]]から[[HLSL]]にMatrix型の[[World座標]]を[[バーテックスバッファ]]経由で渡したい。 | ||
しかしMonoGameから[[HLSL]]に渡す際にデータ型を明示するVertexElementFormatは「Vector4」が最大となっている。Matrix型はない。 | |||
そこで「MatrixはVector4が4個セットになったもの」と仮定してVector4を4個ズラズラ列べてみる。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(16, VertexElementFormat.Vector4, VertexElementUsage.BlendWeight, 1), | |||
new VertexElement(32, VertexElementFormat.Vector4, VertexElementUsage.BlendWeight, 2), | |||
new VertexElement(48, VertexElementFormat.Vector4, VertexElementUsage.BlendWeight, 3)); | |||
// ダイナミックバーテックスバッファーを生成する | // ダイナミックバーテックスバッファーを生成する | ||
| 34行目: | 31行目: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
HLSL側は「float4が4個」として受け取り、[[バーテックスシェーダー]]内でmatrixに合成している。 | |||
<syntaxhighlight lang="hlsl"> | <syntaxhighlight lang="hlsl"> | ||
// 「float4が4個」として受け取る。 | // 「float4が4個」として受け取る。 | ||
struct | struct VSInstance | ||
{ | { | ||
float4 w1 : BLENDWEIGHT0; | |||
float4 w2 : BLENDWEIGHT1; | |||
float4 w3 : BLENDWEIGHT2; | |||
float4 w4 : BLENDWEIGHT3; | |||
}; | }; | ||
VSOutput VSMain(VSInput input, VSInstance instance) | |||
{ | { | ||
VSOutput output = (VSOutput)0; | |||
// 「float4が4個」をmatrixに合成する。 | |||
matrix world = matrix(instance.w1, instance.w2, instance.w3, instance.w4); | |||
// 〜以下略〜 | // 〜以下略〜 | ||
return output; | return output; | ||
} | } | ||