はかせのラボ

私の頭の中を書いていく雑記ブログです

プログラミング ジオメトリインスタンシング⑪

あいさつ

どうも、はかせです。
最近は色々イベントがあったり、
作品添削のフィードバックをしてたりと(現在進行中ではありますが)
ジオメトリインスタンシングが止まってましたが今回からまた再開です。
今回はStructuredBufferなるものを使ってみたら惜しいとこまで行った話です。

StructuredBuffer

名前の通りのバッファとしてシェーダーに渡せる構造体のことです。
この中に行列情報を入れて
シェーダーの中で使おうというのが今回の狙いです。

進捗

実装コードの抜粋です。

//StructuredBufferの構造体
struct PerInstanceData
{
	DirectX::XMMATRIX matrix;
};

//StructuredBufferを作成
D3D11_BUFFER_DESC bd_instance;
bd_instance.Usage = D3D11_USAGE_DYNAMIC;
bd_instance.ByteWidth = sizeof(PerInstanceData) * mInstanceNum;
bd_instance.BindFlags = D3D11_BIND_SHADER_RESOURCE;
bd_instance.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
bd_instance.MiscFlags = D3D11_RESOURCE_MISC_BUFFER_STRUCTURED;
bd_instance.StructureByteStride = sizeof(PerInstanceData);
mDevice->CreateBuffer(&bd_instance, NULL, &mPerInstanceBuffer);

//ShaderResourceViewを作成
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
ZeroMemory(&srvDesc, sizeof(D3D11_SHADER_RESOURCE_VIEW_DESC));
srvDesc.ViewDimension = D3D11_SRV_DIMENSION_BUFFEREX;   
srvDesc.BufferEx.FirstElement = 0;
srvDesc.Format = DXGI_FORMAT_UNKNOWN;
srvDesc.BufferEx.NumElements = mInstanceNum;                 
mDevice->CreateShaderResourceView(mPerInstanceBuffer.Get(),&srvDesc,&mShaderResourceView);

//シェーダーにデータを渡す
mDeviceContext->Map(mPerInstanceBuffer.Get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &pdata);
PerInstanceData* instanceData = (PerInstanceData*)(pdata.pData);
for (int i = 0; i < mInstanceNum; i++)
{
	instanceData[i].matrix = (XMMatrixTranspose(XMMatrixRotationY(0) * XMMatrixTranslation(0, i, 0) * View * Proj));
}
mDeviceContext->Unmap(mPerInstanceBuffer.Get(), 0);
mDeviceContext->VSSetShaderResources(0, 1, mShaderResourceView.GetAddressOf());

シェーダー

struct PerInstanceData
{
    matrix instanceMat;
};

StructuredBuffer<PerInstanceData> g_pInstanceData : register(t0);


VS_OUT VS(VS_IN input)  
{
    VS_OUT output;
    output.pos = mul(input.pos, g_pInstanceData[input.instanceID].instanceMat);
    return output;
};

実行です。
f:id:hakase0274:20190620233520p:plain

惜しい!
なんかメッシュがおかしいこと除けば割と目的に近い感じになった!

あとがき

今回はジオメトリインスタンシングが惜しいとこまで行った話でした。
ようやっとなにか出るようになりました。

自分なりに独学でもがいていたのでかなり時間はかかってしまいましたが、
ようやくジオメトリインスタンシングの輪郭が
ぼんやりとですがつかめてきました。

この調子で実装を進めて実用化まで習得していきたいと思います。
それでは今回はこの辺でノシ

今回作ったものはgithubに上げました
github.com