Глубина рендеринга в HLSL - PullRequest
       64

Глубина рендеринга в HLSL

2 голосов
/ 16 октября 2010

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

Я просто хочу получить визуализацию глубины в моей сцене с помощью шейдера:

float4x4 matViewProjection;
float4x4 matWorld;
float4 eyePos;

struct VS_OUTPUT 
{
  float4 position : POSITION0;
  float depth : TEXCOORD0;
};

VS_OUTPUT vs_main( VS_INPUT input )
{
 VS_OUTPUT output;
 output.position = mul( input.position, matViewProjection );

 float3 posWorld = mul(input.position, matWorld);
 output.depth = distance(posWorld, eyePos);
 return( output );
}

Чтобы получить значение глубины (или я так думал), я вычисляю расстояние между положением в мировом пространстве и положением вида.

и соответствующий пиксельный шейдер

float4 ps_main(VS_OUTPUT input) : COLOR0
{   
   float depth = input.depth;
   return float4(depth, depth, depth, 1.0f);
}

Что приводит только к белому цвету

Итак, я начал пробу и ошибку, умножив значение на глубину:

float depth = input.depth * 0.005f;

, который дает удовлетворительный результат в зависимости от расстояния до объекта. Поэтому, если я подойду ближе к объекту, мне придется снова настроить значение.

Значит, что-то совсем не так ...

Спасибо за чтение!

Ответы [ 2 ]

5 голосов
/ 16 октября 2010

Ну, ваша проблема в том, что вы не нормализуете значение глубины в любой точке. Может быть где угодно в диапазоне от ZNear до ZFar.

Попробуйте следующее для вашего верт-шейдера:

VS_OUTPUT vs_main( VS_INPUT input )
{
 VS_OUTPUT output;
 output.position = mul( input.position, matViewProjection );
 output.depth    = output.position.z / output.position.w;
 return( output );
}

После деления w любое действительное Z-значение будет находиться в диапазоне от 0 до 1. Любое Z-значение, не входящее в этот диапазон, находится за пределами усеченного конуса (т. Е. Перед ближней плоскостью отсечения или позади дальней плоскости отсечения). и, следовательно, все равно не попадет в пиксельный шейдер.

2 голосов
/ 16 октября 2010

Просто короткое добавление: использование

output.depth    = output.position.z / output.position.w;

приводит к окрашиванию от темного до яркого на расстоянии, в то время как

output.depth    = 1.0f - (output.position.z / output.position.w);

приводит к окрашиванию от светлого к темному, что, надеюсь, правильноа также.

...