Войти
ПрограммированиеФорумГрафика

Reconstructing Position from Depth

Страницы: 1 2 Следующая »
#0
1:24, 14 янв. 2015

Здравствуйте, господа!

Тем в интернете много, давно все описано, но я так и не разобрался в своем случае.

Для начала скриншоты проблемы, слева снизу - чтение позиции из текстуры, справа снизу - реконструкция из буфера глубины.

+ Показать

Шейдеры

+ Показать

Скорее всего неправильно работает функция camera_space_z_from_depth, там где градиент меняется знак. Выводить формулу в 12 ночи не осилю (взял готовую тут https://www.opengl.org/wiki/Compute_eye_space_from_window_space). Есть готовые решения ?

Пробовал дописывать camera_space_z_from_depth + camera_near, результат тот же (масштаб довольно большой, ближняя плоскость = 1)


#1
1:30, 14 янв. 2015

Держи
https://github.com/sergeyreznik/et-engine/blob/master/demo/scene-… viewspace.fsh

clipPlanes - ближняя (x) и дальняя (y) плоскости отсечения
texCoordScales = vec2(-inverseProjectionMatrix[0][0], -inverseProjectionMatrix[1][1]);
надеюсь, разберешься
#2
1:34, 14 янв. 2015

На steps3d немного другая формула:

float d = texture2D ( depthMap, gl_TexCoord [0].st ).a;
float zEye = zFar * zNear / ( d * (zFar - zNear) - zFar );

#3
1:44, 14 янв. 2015

Dimich
Да, она не работает.

#4
1:44, 14 янв. 2015

возможно там перекручено наоборот из-за лево-правосторонних систем координат ?

вариант с :

2.0 * camera_far * camera_near / (depth * (camera_far - camera_near) - camera_far - camera_near);
+ Показать

2.0 * camera_far * camera_near / (camera_far + camera_near - depth * (camera_far - camera_near));
+ Показать
#5
1:44, 14 янв. 2015

Ага, забыл сказать, что глубина должна быть приведена в интервал [-1...1]

2.0 * texture(depth, texCoord).x - 1.0

#6
1:45, 14 янв. 2015

Mikey
О! Вижу Лену на gi_flag.tga :)

#7
1:46, 14 янв. 2015

Ну а вообще посмотри мою демку:
https://github.com/sergeyreznik/et-engine/tree/master/demo/scene-rendering

#8
2:08, 14 янв. 2015

Sergio
Ага, она :)

Вроде все так же, только вот что это такое ? нигде не встречал.

texCoordScales = vec2(-cam.inverseProjectionMatrix()[0][0], -cam.inverseProjectionMatrix()[1][1]);

#9
2:28, 14 янв. 2015

у меня так:

вертексный:
#version 410 core

#define VERT_POSITION 0
#define VERT_TEXCOORD 1

layout(location = VERT_POSITION) in vec2 position;
layout(location = VERT_TEXCOORD) in vec2 texcoord;

//uniform mat4 modelViewMatrix;

out Vertex {
  vec2 texcoord;
  vec3 pos;
} Vert;

void main(void)
{     
  Vert.texcoord = texcoord;
  Vert.pos = vec3(position.xy * vec2(0.577350 * 16.0/9.0, 0.577350), -1.0);
  gl_Position = vec4(position.xy, -1.0, 1.0);
}

реконстр. в фрагментном:

const float zNear = 1.0;
const float zFar = 10000.0;

float zEye = zFar * zNear / (Z * (zFar - zNear) - zFar);
vec3 eyeCoord = -Vert.pos * zEye;

------------------

где Z - значение из depth-buffer

#10
2:30, 14 янв. 2015

veth
> Vert.pos = vec3(position.xy * vec2(0.577350 * 16.0/9.0, 0.577350), -1.0);
> const float zNear = 1.0;
> const float zFar = 10000.0;
Хардкод - зло.

#11
4:26, 14 янв. 2015

Mikey
> Вроде все так же, только вот что это такое ? нигде не встречал.
Это чтобы учитывать FOV камеры и пропорции окна.

#12
4:47, 14 янв. 2015

Что за линеаризация глубины? Зачем и почему? Линеаризация для другого нужна.
Делай через обратную матрицу.

float3 _innerGetPosition(float2 UV, float depth, float4x4 IVPUV)
{
  float4 position = 1.0f; 
  position.x = UV.x;
  position.y = UV.y;
  position.z = depth; 

  position = mul(position, IVPUV); 
  position /= position.w;

  return position.xyz;
}

Где IVPUV - это матрица ввида:
_iuvProjection = Matrix.Scaling(2f, -2f, 1f) * Matrix.Translation(-1f, 1f, 0f) * Matrix.Invert(_viewProjection);

#13
5:05, 14 янв. 2015

forhaxed
Так мы можем очень быстро восстановить положения во view-space. Иногда бывает удобно.

#14
5:25, 14 янв. 2015

forhaxed
Но по сути - это и есть использование обратной матрицы, но без самой матрицы и лишних умножений.

Страницы: 1 2 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.