Логарифмическая линеаризация буфера глубины

Как линеаризовать логарифмический буфер глубины?

визуализация линейного буфера глубины во фрагментном шейдере

  float n = 1.0; // camera z near
  float f = 27000000.0; // camera z far
  float z = texture( DepthTex, TexCoord ).x;
  float d = (2.0 * n) / (f + n - z * (f - n));
  FragColor=vec4(d,d,d,1);

вершинный шейдер сферы

vec4 ClipCoords(vec3 position,mat4 matrix)
{
   vec4 clip = matrix * vec4(position,1.0f);
   clip.z =((2.0f * log(1.0f * clip.z + 1.0f) / log(1.0f * 27000000.0f + 1.0f)) - 1.0f) * clip.w;
   return clip;
}
 gl_Position = ClipCoords(position,matrix);

В левой части показана логарифмическая линеаризация буфера глубины, вернее, ее отсутствие, а в правой части показана линеаризация без log просто gl_Position = matrix * vec4(position,1.0f); введите здесь описание изображения


person user1075940    schedule 12.08.2013    source источник


Ответы (1)


С логарифмическим буфером глубины отображение глубины сцены (пространства камеры) в значения, которые в конечном итоге попадают в буфер глубины (0..1):

depth_value = log(C*z + 1) / log(C*Far + 1)

где z — положительная глубина сцены, которую в противном случае можно получить из компонента w в пространстве клипа после проекции (в вашем коде вы можете использовать ..log(clip.w + 1.0)..).

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

z = (exp(depth_value*log(C*far+1)) - 1)/C

или эквивалентно

z = (pow(C*far+1,depth_value)-1)/C

Чтобы получить линейное отображение от 0..far до 0..1, просто разделите его на значение far.

person camenomizoratojoakizunewake    schedule 12.08.2013
comment
Что такое C (и в меньшей степени far) в этих уравнениях? Я предполагаю, где FrustumFar? - person Richard Tingle; 11.05.2014
comment
C — константа, используемая для настройки логарифмического профиля. Его эффект описан в outterra.blogspot.com/2012. /11/ в сравнении логарифмических функций глубины. Обычно вы можете безопасно установить его на 1. far соответствует дальнему расстоянию усеченной пирамиды. - person camenomizoratojoakizunewake; 14.05.2014