Почему мой контент Direct3D не отображается? Я создаю приложение XAML WinUI 3 с DirectX11 для рендеринга контента.C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему мой контент Direct3D не отображается? Я создаю приложение XAML WinUI 3 с DirectX11 для рендеринга контента.

Сообщение Anonymous »

Как сказано в заголовке, я работаю с взаимодействием XAML и DirectX. Все, что мне нужно, — это рендеринг 3D-контента, но сейчас он показывает только фон.
Приложение может отображать фон с помощью ClearRenderTargetView, поэтому я знаю, что это не так. Проблема с неправильным созданием экземпляра Render Target. Точно такая же настройка работает и для моего контента Direct2D, поэтому я не думаю, что я неправильно создаю цепочку обмена. Никаких ошибок или нулевых значений, привязанных к конвейеру, не появляется, и я уже миллион раз проверил BUFFER_DESC для своих буферов. Должно быть, мне что-то не хватает, возможно, что-то специфическое для WinUI 3, поскольку я использовал практически идентичный код в обычном приложении для Windows, и оно могло прекрасно отображать там 3D-контент.
Мое предположение связано с тем, как я получаю информацию о шейдерах. Раньше я использовал файлы .cso, сгенерированные для создания больших двоичных объектов и создания шейдеров, но мой новый проект не мог их найти, что бы я ни пытался, поэтому я переключился на создание переменной заголовка для получения информации. Это единственное существенное отличие от того, как я писал это раньше.
Здесь я демонстрирую все необходимое для рендеринга контента

Код: Выделить всё

//descriptor structure
DXGI_SWAP_CHAIN_DESC1 swapDesc = {0};
swapDesc.Width = 1250; //change to actually fill screen based on window size later
swapDesc.Height = 650;
swapDesc.Stereo = false;
swapDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; //layout of the pixels
swapDesc.Scaling = DXGI_SCALING_STRETCH;
swapDesc.SampleDesc.Count = 1;
swapDesc.SampleDesc.Quality = 0;
swapDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
swapDesc.BufferCount = 2; //1 front buffer and 1 back buffer
swapDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL;
swapDesc.Flags = 0;

D3D_FEATURE_LEVEL featureLevels[] =
{
D3D_FEATURE_LEVEL_11_1,
D3D_FEATURE_LEVEL_11_0,
D3D_FEATURE_LEVEL_10_1,
D3D_FEATURE_LEVEL_10_0,
D3D_FEATURE_LEVEL_9_3,
D3D_FEATURE_LEVEL_9_2,
D3D_FEATURE_LEVEL_9_1
};
D3D_FEATURE_LEVEL supportedFeatureLevel;

//create device and rendering context
winrt::check_hresult(D3D11CreateDevice(
nullptr, //adapter
D3D_DRIVER_TYPE_HARDWARE,
0, //software driver
D3D11_CREATE_DEVICE_BGRA_SUPPORT, //flags
featureLevels, //feature level
ARRAYSIZE(featureLevels),
D3D11_SDK_VERSION,
p3DDevice.put(),
&supportedFeatureLevel, //where feature level is put into
p3DContext.put()
));

//create factory
//get device first
winrt::com_ptr p3DDXGIDevice{ p3DDevice.as() };//different from the device made just now, it goes above it
//then adapter
winrt::com_ptr < IDXGIAdapter> p3DDXGIAdapter = nullptr;
p3DDXGIDevice->GetAdapter(p3DDXGIAdapter.put());
//then factory
p3DDXGIAdapter->GetParent(__uuidof(IDXGIFactory2), (void**)&p3DFactory);
p3DFactory.capture(p3DDXGIAdapter, &IDXGIAdapter::GetParent);

//create swap chain
winrt::check_hresult(
p3DFactory->CreateSwapChainForComposition(
p3DDevice.get(),
&swapDesc,
nullptr, //restricts output to whatvers put here, could be useful later for switching between modes
p3DSwapChain.put()
));

//get native interface
auto panelNative{ swapChainPanel().as() };

winrt::check_hresult(
panelNative->SetSwapChain(p3DSwapChain.get()) //assign swap chain to native interface
);

//get back buffer
winrt::check_hresult(
p3DSwapChain->GetBuffer(0, IID_PPV_ARGS(p3DBackBuffer.put())));
//create render target
winrt::check_hresult(
p3DDevice->CreateRenderTargetView(p3DBackBuffer.get(), nullptr, p3DRenderTarget.put()));
И вот здесь я создаю настоящий 3D-контент

Код: Выделить всё

struct Vertex {
struct { float x, y, z; } pos;
struct { unsigned char r, g, b, a; } color;
};
Vertex vertices[] = { //for shape
{ 0.0f, 1.0f, 0.0f,     255, 0, 0 }, //top of pyramid
{ -1.0f, -1.0f, 1.0f,   0, 255, 0 }, //front left bottom point
{ 1.0f, -1.0f, 1.0f,    0, 0, 255 }, //front right bottom point
{ 0.0f, -1.0f, -1.0f,   255, 255, 0 } //back bottom point
};

//making buffer
winrt::com_ptr pVertexBuffer;
D3D11_BUFFER_DESC bufferDesc = {0};
bufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
bufferDesc.Usage = D3D11_USAGE_DEFAULT;
bufferDesc.CPUAccessFlags = 0;
bufferDesc.MiscFlags = 0;
bufferDesc.ByteWidth = sizeof(vertices);
bufferDesc.StructureByteStride = sizeof(Vertex);
D3D11_SUBRESOURCE_DATA subData = {0};
subData.pSysMem = vertices;
subData.SysMemPitch = 0;
subData.SysMemSlicePitch = 0;
winrt::check_hresult(p3DDevice->CreateBuffer(&bufferDesc, &subData, pVertexBuffer.put()));

//bind vertex buffer to pipeline
const UINT stride = sizeof(Vertex);
const UINT offset = 0u;
p3DContext->IASetVertexBuffers(0u, 1u, pVertexBuffer.put(), &stride, &offset);

// create index buffer
const unsigned short indices[] = //indices must be listed clockwize cuz triangle list primitive topology
{
1, 0, 2,
3, 0, 1,
2, 3, 1,
2, 0, 3
};
winrt::com_ptr  pIndexBuffer;
D3D11_BUFFER_DESC ibd = {0};
ibd.BindFlags = D3D11_BIND_INDEX_BUFFER;
ibd.Usage = D3D11_USAGE_DEFAULT;
ibd.CPUAccessFlags = 0u;
ibd.MiscFlags = 0u;
ibd.ByteWidth = sizeof(indices);
ibd.StructureByteStride = sizeof(unsigned short);
D3D11_SUBRESOURCE_DATA isd = {0};
isd.pSysMem = indices;
isd.SysMemPitch = 0;
isd.SysMemSlicePitch = 0;
winrt::check_hresult(p3DDevice->CreateBuffer(&ibd, &isd, pIndexBuffer.put()));
// bind index buffer
p3DContext->IASetIndexBuffer(pIndexBuffer.get(), DXGI_FORMAT_R16_UINT, 0u);

//constant buffer for transformation matrix
struct ConstantBuffer {
dx::XMMATRIX transform;
};
//rotation matrix around z axis
const ConstantBuffer constBuffer = {
{
dx::XMMatrixTranspose(
dx::XMMatrixTranslation(0.0f, 0.0f, 3.0f) * //move it back a bit so its visible
dx::XMMatrixPerspectiveLH(1.0f, 1.0f, 0.5f, 10.0f)  //params are width, height, nearZ and farZ
)
}
};
winrt::com_ptr pConstantBuffer;
D3D11_BUFFER_DESC constBuffDesc;
constBuffDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
constBuffDesc.Usage = D3D11_USAGE_DYNAMIC; //updates every frame
constBuffDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
constBuffDesc.MiscFlags = 0u;
constBuffDesc.ByteWidth = sizeof(constBuffer);
constBuffDesc.StructureByteStride = 0u;
D3D11_SUBRESOURCE_DATA constSubData = {0};
constSubData.pSysMem = &constBuffer;
constSubData.SysMemPitch = 0;
constSubData.SysMemSlicePitch = 0;
winrt::check_hresult(p3DDevice->CreateBuffer(&constBuffDesc, &constSubData, pConstantBuffer.put()));
//bind to pipeline
p3DContext->VSSetConstantBuffers(0u, 1u, pConstantBuffer.put());

//create vertex shader
winrt::com_ptr pVertexShader;
winrt::check_hresult(p3DDevice->CreateVertexShader(g_VertexShader, sizeof(g_VertexShader), nullptr, pVertexShader.put()));
//bind vertex shader
p3DContext->VSSetShader(pVertexShader.get(), 0, 0);

//create pixel shader
winrt::com_ptr pPixelShader;
winrt::check_hresult(p3DDevice->CreatePixelShader(g_PixelShader, sizeof(g_PixelShader), nullptr, pPixelShader.put()));
//bind pixel shader
p3DContext->PSSetShader(pPixelShader.get(), 0, 0);

//input layout
winrt::com_ptr pInputLayout;
const D3D11_INPUT_ELEMENT_DESC ied[] = {
{"Position", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0},
{ "Color", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, 12u, D3D11_INPUT_PER_VERTEX_DATA, 0 }
};
winrt::check_hresult(p3DDevice->CreateInputLayout(
ied,
(UINT)std::size(ied),
g_VertexShader,
sizeof(g_VertexShader),
pInputLayout.put()
));
p3DContext->IASetInputLayout(pInputLayout.get());

//bind render target
p3DContext->OMSetRenderTargets(1u, p3DRenderTarget.put(), nullptr);

//set primitive topology
p3DContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);

p3DContext->DrawIndexed((UINT)std::size(indices), 0u, 0u);
Заранее спасибо, что прочитали все это, даже если вы ничего не можете понять.

Подробнее здесь: https://stackoverflow.com/questions/792 ... lication-w
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»