2016-05-20 8 views
0

Если я хочу очистить весь вид глубины/трафарета в Direct3D 11, я могу легко позвонить ID3D11DeviceContext::ClearDepthStencilView.Как очистить только часть изображения глубины/трафарета?

Direct3D 11.1 добавляет опору для очистки прямоугольных участков render target просмотров с использованием ID3D11DeviceContext1::ClearView.

Но я не вижу возможности очистить только часть изображения глубины/трафарета в Direct3D 11, за исключением рендеринга квадрата по желаемой области? Это похоже на нечетную регрессию Direct3D 9, где это было тривиально легко. Я что-то пропустил, или это действительно не поддерживается?

+0

Вы должны добавить информацию о том, почему вам нужна такая вещь, потому что частичная очистка поверхностей при больших операциях имеет большую цену. – galop1n

ответ

1

Нет такой функции, которая может очищать только часть изображения глубины/трафарета. Это мой способ решить эту проблему:

  1. сделать текстуру. Установить альфа части, чтобы очистить до 1, а другая часть до 0.
  2. открыт AlphaTest, только пикселя, альфа 1.
  3. открыт AlphaBlend, установленный BlendOP к Add, установить SrcBlend коэффициент 0, установить коэффициент DestBlend до 1.
  4. комплект StencilTest и DepthTest до Always, установите StencilRef на значение, которое вы хотите очистить.
  5. использовать ортогональную матрицу проекции.
  6. нарисуйте прямоугольник, который просто закрывает экран (z-координата/(ZFar-ZNear) преобразуется в глубину) и вставляем текстуру на нем.
+0

Да, я подумал, что это необходимо. Я действительно надеялся избежать установки, а затем восстановить все это состояние, чтобы сделать четкую операцию. Благодарю. –

+1

Обычно это плохая практика, чтобы очистить только часть буфера глубины и даже цветного буфера. Это приведет к победе над всеми ценными графическими процессорами, такими как Hi-Z. И это еще хуже, если вы используете трафарет только для ясного. У графических процессоров есть быстрые четкие функции, и если вы не читаете буфер глубины, то это невозможно. Какова ваша первоначальная проблема? И даже если вам нужна четкость четкости, пожалуйста, не включайте текстуры или трафарет, вы можете просто нарисовать квадрат, чтобы покрыть область с надлежащей глубиной, чтобы записать значение. – galop1n

+0

@ galop1n Я портирую существующий игровой движок от D3D9 до D3D11. Двигатель поддерживает очистку прямоугольных подзонов как цветных, так и глубинных/трафаретных буферов, поэтому мне нужно подражать этому в D3D11. И нет, я не могу удалить эту функцию из движка, потому что от этого зависит множество игр. –

-1

Существует отличная причина для удаления частичных очисток в API. Во-первых, всегда можно эмулировать их, рисуя квадратики с правильными состояниями отображения, а во-вторых, все графические процессоры быстро очищают и разрешают аппаратное обеспечение. Использование их в логике намерения значительно повышает производительность рендеринга.

С понятным API DX11 можно использовать быструю очистку и последнюю оптимизацию графического процессора. Глубокий буфер быстро очищается и готов к раннему тестированию на глубину (до закрашивания пикселей, потому что да, реальный тест глубины - затенение после пикселя), а определенная оптимизация полосы пропускания при доступе к буфере глубины будет рендерить. Если вы сбросите с помощью квадроцикла, вы потеряете все это, и стоимость вытягивания повысится.