メインメニューを開く

差分

MonoGameでHLSLにMatrixを渡す

37 バイト追加, 2020年6月10日 (水) 01:50
編集の要約なし
[[ハードウェアインスタンシング]]を利用するにあたり[[C♯]]から[[HLSL]]にMatrix型の[[World座標]]を渡したい。を[[バーテックスバッファ]]経由で渡したい。
しかしMonoGameではしかしMonoGameから[[HLSL]]に渡すデータ型を示すVertexElementFormatは「Vector4」が最大となっており、Vector4が4個セットになっているMatrix型は渡せない。に渡す際にデータ型を明示するVertexElementFormatは「Vector4」が最大となっている。Matrix型はない。
そこでMatrixはVector4の4倍と仮定してVector4を4個ズラズラ列べる。VertexElementUsageはfloat4型のセマンティクス、かつ誰も使ってないであろうBlendWeightを指定した。そこで「MatrixはVector4が4個セットになったもの」と仮定してVector4を4個ズラズラ列べてみる。VertexElementUsageはfloat4型のセマンティクス、かつ誰も使ってないであろうBlendWeightを指定した。
<syntaxhighlight lang="csharp">
// 仕方がないので「Vector4が4個」と指定する。
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));
// ダイナミックバーテックスバッファーを生成する
</syntaxhighlight>
HLSL側はfloat4が4個で受け取り、シェーダー関数内でmatrixに合成している。HLSL側は「float4が4個」として受け取り、[[バーテックスシェーダー]]内でmatrixに合成している。
<syntaxhighlight lang="hlsl">
// 「float4が4個」として受け取る。
struct InstanceInput VSInstance
{
float4 w1 : BLENDWEIGHT0; float4 w2 : BLENDWEIGHT1; float4 w3 : BLENDWEIGHT2; float4 w4 : BLENDWEIGHT3;
};
VertexShaderOutput MainVSVSOutput VSMain(VertexShaderInput VSInput input, InstanceInput VSInstance instance)
{
VertexShaderOutput VSOutput output = (VertexShaderOutputVSOutput)0;
// 「float4が4個」をmatrixにする。「float4が4個」をmatrixに合成する。 matrix world = matrix(instance.w1, instance.w2, instance.w3, instance.w4);
// 〜以下略〜
 
return output;
}