Как рассчитать глубину пиксельного шейдера для визуализации круга, нарисованного на точечном спрайте, в виде сферы, которая будет пересекаться с другими объектами?
Я пишу шейдер для рендеринга сфер на точечных спрайтах, рисуя заштрихованные круги, и мне нужно написать компонент глубины, а также цвет, чтобы сферы рядом пересекались правильно.
Я использую код, аналогичный написанномуДжона Холверда:
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