DirectX Toolkit C ++ SpriteBatch Рисование прямоугольника

Я использую DirectX 11, DirectX Toolkit и C ++. Как я могу создать прямоугольник с синей рамкой для spritebatch? Я предполагаю, что мне нужно создать текстуру в памяти, возможно, с синей рамкой в ​​1 пиксель?

ComPtr<ID3D11ShaderResourceView>    spriteSheet_;

ComPtr<ID3D11Resource> resource;
CreateDDSTextureFromFile(d3dDevice_, L"mytex.dds", resource.GetAddressOf(),
spriteSheet_.ReleaseAndGetAddressOf());

batch->Draw(spriteSheet_.Get(), position, &sourceRect, DirectX::Colors::White,
rotation_, spriteOrigin_, scale_, DirectX::SpriteEffects_None, depth_);

0

Решение

Ты можешь использовать SpriteBatch чтобы нарисовать однопиксельную текстуру, как вы описали — вы можете использовать белую текстуру и использовать тонирование SpriteBatch, чтобы сделать его синим.

Вот простой код для программного создания белой текстуры 1×1 в Direct3D 11:

    Microsoft::WRL::ComPtr<ID3D11ShaderResourceView> pWhiteTexture;

static const uint32_t s_pixel = 0xffffffff;

D3D11_SUBRESOURCE_DATA initData = { &s_pixel, sizeof(uint32_t), 0 };

D3D11_TEXTURE2D_DESC desc;
memset( &desc, 0, sizeof(desc) );
desc.Width = desc.Height = desc.MipLevels = desc.ArraySize = 1;
desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
desc.SampleDesc.Count = 1;
desc.Usage = D3D11_USAGE_IMMUTABLE;
desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;

Microsoft::WRL::ComPtr<ID3D11Texture2D> tex;
HRESULT hr = mDevice->CreateTexture2D( &desc, &initData, &tex );

DX::ThrowIfFailed(hr);

D3D11_SHADER_RESOURCE_VIEW_DESC SRVDesc;
memset( &SRVDesc, 0, sizeof( SRVDesc ) );
SRVDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
SRVDesc.Texture2D.MipLevels = 1;

hr = mDevice->CreateShaderResourceView( tex.Get(), &SRVDesc, &pWhiteTexture );

DX::ThrowIfFailed(hr);

Более эффективным решением было бы использовать PrimitiveBatch нарисовать синий квад, где вы хотите, чтобы он был расположен.

См. Учебник по DirectX Tool Kit. Простой рендеринг

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]