Как рассчитать глубину пиксельного шейдера для визуализации круга, нарисованного на точечном спрайте, в виде сферы, которая будет пересекаться с другими объектами?

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

Я использую код, аналогичный написанномуДжона Холверда:

void PS_ShowDepth(VS_OUTPUT input, out float4 color: COLOR0,out float depth : DEPTH)
{
   float dist = length (input.uv - float2 (0.5f, 0.5f)); //get the distance form the center of the point-sprite
   float alpha = saturate(sign (0.5f - dist));
   sphereDepth = cos (dist * 3.14159) * sphereThickness * particleSize; //calculate how thick the sphere should be; sphereThickness is a variable.

   depth = saturate (sphereDepth + input.color.w); //input.color.w represents the depth value of the pixel on the point-sprite
   color = float4 (depth.xxx ,alpha ); //or anything else you might need in future passes
}

Видео по этой ссылке дает хорошее представление о том, какой эффект я испытываю.m after: те сферы, которые нарисованы на точечных спрайтах, правильно пересекаются. Я'Мы добавили изображения ниже, чтобы проиллюстрировать тоже.

Я могу рассчитать глубину точечного спрайта, сам отлично. Тем не менее, я не уверен, что показатьрассчитать толщину сферы в пикселе чтобы добавить его в спрайтс глубиной, чтобы дать окончательное значение глубины. (Приведенный выше код использует переменную, а не вычисляет ее.)

мы работали над этим в течение нескольких недель, но покаЯ понял это - яя уверен, что этовсе просто, но этоЧто-то, что мой мозг не имеетт

Direct3D 9 'Размеры спрайтов в точках s рассчитываются в пикселях, а мои спрайты имеют несколько размеров - оба по спаду из-за расстояния (я реализовалтот же алгоритм, что и старый конвейер с фиксированной функцией, используемый для вычисления размера точки в моем вершинном шейдере), а также из-за того, что представляет собой спрайт.

Как перейти от данных, которые у меня есть в пиксельном шейдере (местоположение спрайта, глубина спрайта, исходный радиус мирового пространства, радиус в пикселях на экране, нормализованное расстояние рассматриваемого пикселя от центра спрайта), до значения глубины? Частичное решение просторазмер спрайта по толщине сферы в координатах глубины было бы хорошо - это можно масштабировать на нормализованное расстояние от центра, чтобы получить толщину сферы в пикселе.

Я использую Direct3D 9 и HLSL с шейдерной моделью 3 в качестве верхнего предела SM.

В картинках

Чтобы продемонстрировать технику и точку, в которой яУ меня возникли проблемы:

Начните с двухточечных спрайтов, и в пиксельном шейдере нарисуйте круг на каждом, используяклип удалить фрагменты вне круга »граница s:

Один будет рендериться выше другого, так как в конце концов они являются плоскими поверхностями.

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

(Вышеуказанное легко; этопоследний шаг, с которым у меня возникли проблемы, и спрашиваю, как этого добиться.)

Теперь вместо пиксельного шейдера, записывающего только значения цвета, он должен также записать глубину:

void SpherePS (...any parameters...
    out float4 oBackBuffer : COLOR0,
    out float oDepth : DEPTH0 

Ответы на вопрос(3)

Ваш ответ на вопрос