Я пытаюсь реализовать простой способ рендеринга частиц в своем игрушечном приложении. Я визуализирую четырехугольники рекламных щитов с альфа-смешением, но это вызывает проблему с трафаретом глубины, когда части четырехугольника, которые полностью прозрачны, все еще закрывают частицы позади них, поскольку они не проходят тест глубины. Результат выглядит следующим образом:
Вот как я настроил свой конвейер:
// rasterizer
D3D11_RASTERIZER_DESC rasterizerDesc;
rasterizerDesc.AntialiasedLineEnable = true;
rasterizerDesc.CullMode = D3D11_CULL_BACK;
rasterizerDesc.DepthBias = 0;
rasterizerDesc.DepthBiasClamp = 0.0f;
rasterizerDesc.DepthClipEnable = true;
rasterizerDesc.FillMode = D3D11_FILL_SOLID;
rasterizerDesc.FrontCounterClockwise = false;
rasterizerDesc.MultisampleEnable = true;
rasterizerDesc.ScissorEnable = false;
rasterizerDesc.SlopeScaledDepthBias = 0.0f;
// depth stencil state
D3D11_DEPTH_STENCIL_DESC depthStencilStateDesc;
ZeroMemory(&depthStencilStateDesc, sizeof(D3D11_DEPTH_STENCIL_DESC));
depthStencilStateDesc.DepthEnable = TRUE;
depthStencilStateDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL;
depthStencilStateDesc.DepthFunc = D3D11_COMPARISON_LESS;
depthStencilStateDesc.StencilEnable = FALSE;
// blend state
D3D11_BLEND_DESC blendStateDescription;
ZeroMemory(&blendStateDescription, sizeof(D3D11_BLEND_DESC));
blendStateDescription.AlphaToCoverageEnable = FALSE;
blendStateDescription.IndependentBlendEnable = FALSE;
blendStateDescription.RenderTarget[0].BlendEnable = TRUE;
blendStateDescription.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA;
blendStateDescription.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA;
blendStateDescription.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD;
blendStateDescription.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ONE;
blendStateDescription.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ZERO;
blendStateDescription.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD;
blendStateDescription.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;
Я искал некоторое время, но не совсем уверен, как настроить трафарет глубины для правильной работы с альфа-смешением здесь, или даже если это правильный подход. Глядя на захват документа рендеринга, он просто не заботится о прозрачности:
Не уверен, какие другие настройки могут быть здесь важны, поэтому дайте мне знать в комментариях, и я включу все, что имеет отношение к этому делу.





Я понял это в конце концов. Короче говоря, нет автоматического способа справиться с этим. Простая реализация состоит в том, чтобы сначала рисовать непрозрачные объекты при записи в буфер глубины, а затем рисовать прозрачные объекты только с проверкой глубины, без записи в трафарет глубины. Прозрачные изображения должны быть отсортированы по глубине и отображены от самого дальнего к ближайшему к точке обзора.
Дополнение к предыдущим изображениям:
Да, стандартный алгоритм сортировки прозрачности по глубине заключается в отрисовке всех непрозрачных объектов, а затем отрисовке всех альфа-объектов. Вам также может понадобиться полностью отсортировать альфа-объекты a.l.a. Алгоритм художника для правильного смешивания, но это может быть довольно сложно и дорого.