Значения глубины прикрепления WebGL2 FBO

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

//Texture
depthTexture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, depthTexture);
 
gl.texImage2D(gl.TEXTURE_2D, 0, gl.DEPTH_COMPONENT24,
                width, height, 0,
                gl.DEPTH_COMPONENT, gl.UNSIGNED_INT, null);
 
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);

//FBO
fb = gl.createFramebuffer();
gl.bindFramebuffer(gl.FRAMEBUFFER, fb);
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.TEXTURE_2D, depthTexture, 0);
gl.bindFramebuffer(gl.FRAMEBUFFER, null);

Затем я делаю это так:

gl.bindFramebuffer(gl.FRAMEBUFFER, fb);

gl.useProgram(shaderProgram);

//Just a torus...
gl.bindVertexArray(vao);
 
gl.colorMask(false, false, false, false);
gl.enable(gl.DEPTH_TEST);
gl.clear(gl.DEPTH_BUFFER_BIT);
...
gl.drawElements(gl.TRIANGLES, indices.length, gl.UNSIGNED_SHORT,0);

//Then I draw a full screen quad that simply samples the depth texture
gl.bindFramebuffer(gl.FRAMEBUFFER, null)
....

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

Программы, которые я использую для рендеринга в FBO, очень просты.

Верт:

#version 300 es
 
layout(location = 0) in vec3 position;

uniform mat4 projection;
uniform mat4 view;
uniform mat4 model;

void main() {
 
  gl_Position = projection * view * model * vec4(position, 1.);
}

Фрагмент:

#version 300 es
precision highp float;


layout(location = 0) out vec4 outColor;

void main() {
  outColor = vec4(1,0,0,1)
}

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

Ваше здоровье


person Doc    schedule 05.12.2017    source источник
comment
Забыл упомянуть, но проекционная матрица построена с помощью: mat4.perspective([], Math.PI/3, width / height, 1, 1000) из этой библиотеки glmatrix.net   -  person Doc    schedule 05.12.2017
comment
developer.nvidia.com/content/depth-precision-visualized   -  person LJᛃ    schedule 05.12.2017


Ответы (1)


Спасибо @LJ за ссылку. Кажется, я знаю, что происходит на самом деле. Мои предыдущие выводы были неверны в основном потому, что я не понимал, что происходит. То, что я видел, было, как и ожидалось, логарифмической глубиной, но поскольку мои ближняя и дальняя плоскости отсечения были равны 1 и 1000 соответственно, а тор был относительно близок к ближней плоскости отсечения, это была часть кривой 1/z. где значения группируются, обеспечивая высокую точность. Как только я увеличил глубину тора, я увидел большую потерю точности. После линеаризации его с помощью чего-то вроде Как читать прикрепленную текстуру глубины к FBO в WebGL2 и используя ближнюю и дальнюю плоскости отсечения 0,1 и 10 (чтобы иметь визуальную обратную связь, поскольку тор относительно небольшой по глубине), я мог видеть, что глубина была линейной.

person Doc    schedule 06.12.2017