はかせのラボ

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

プログラミング 複数テクスチャのインスタンシングができた

あいさつ

どうも、はかせです。
今回は前回詰まった複数テクスチャを使ったインスタンシングです。

前回

詳細は前回の記事をご覧ください。
hakase0274.hatenablog.com

簡単にまとめると
複数テクスチャ使ったインスタンシングしようとしたっけ場所が移動した
です。

問題点

前回の描画と同じポインタを使っていたことです。

ちゃんと説明しますので、ご安心を。
今回シェーダーにデータを渡す方法として
Map/Unmapを使いました。
docs.microsoft.com
この関数の最後の引数であるD3D11_MAPPED_SUBRESOURCE構造体に値を入れてデータを渡します。

そこに渡すのはポインタなわけですが、
ポインタってのはメモリの番地です。

つまり今まで渡していたのはデータ配列のポインタで
そのポインタが指す中身が変わったため動いたということでした。
(ネタが分かれば当たり前でしたね)

解決策

使うポインタが同じことが問題ならば新しいポインタを作ればいいだけの話です。

void DXManager::RenderInstancing()
{
	mDeviceContext->VSSetShader(mVertexShader.Get(), NULL, 0);
	mDeviceContext->PSSetShader(mPixelShader.Get(), NULL, 0);

	float defaultYPos = 1.5f;
	float offset = 0.1f;
	int oneLineNum = 10;
	float defaultOffset = -2.0f;

	// パラメータの受け渡し
	D3D11_MAPPED_SUBRESOURCE pdata;
	PerInstanceData* instanceData = nullptr;
	//各テクスチャを描画
	for(auto &texture:mTextures)
	{
		mDeviceContext->Map(mPerInstanceBuffer.Get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &pdata);
		//都度ポインタを入れなおせばいけた
		instanceData = (PerInstanceData*)(pdata.pData);
		for (int i = 0; i < mInstanceNum; i++)
		{
			//とりあえずループ変数使って移動
			float xPos = i % oneLineNum * offset + defaultOffset;
			float yPos = defaultYPos - (i / oneLineNum * offset);
			XMMATRIX move = XMMatrixTranslation(xPos, yPos, 1.0f);
			//行列情報をセット
			instanceData[i].matrix = XMMatrixTranspose(mScale * mRotation * move * mView * mProj);
			//色情報をセット
			instanceData[i].color = XMVectorSet(1.0f, 1.0f, 1.0f, 1.0f);
		}
		mDeviceContext->Unmap(mPerInstanceBuffer.Get(), 0);
		mDeviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
		mDeviceContext->VSSetShaderResources(0, 1, mShaderResourceView.GetAddressOf());
		ID3D11ShaderResourceView* srv[] = { mShaderResourceView.Get() ,texture->mTextureShaderResourceView.Get() };
		mDeviceContext->PSSetShaderResources(0, 2, srv);
		// 描画実行
		mDeviceContext->DrawIndexedInstanced(mDrawNum, mInstanceNum, 0, 0, 0);
		defaultOffset += 1.0f;
	}
}

forループで新しいテクスチャを描画する際に
都度新しいポインタにしています。

それでは結果です。
f:id:hakase0274:20190625215013p:plain

無事四色でました。
FPSも58~60の間で安定しています。

あとがき

今回は前回発生した問題の解決編でした。
C++はポインタで色々できる分ちょっと気を抜くと
想定外の動きをしますね。
(それが面白かったりするんですけど)

それと話はまったく変わるんですが、
このブログもかれこれ1年以上やってきているので
そろそろ収益化とかもやってみようかなーと思っています。
(というか既に取り組み自体は始めてます)

なのでその一環でちらほら広告がでたり、
今はアクセスしたら記事一覧にリダイレクトしていますが
それがなくなったりするかもしれません。

その時は「あぁ、なんか色々やってるんだな」と思って
暖かく見守ってくださると幸いです。

それでは今回はこの辺でノシ