Я пытаюсь реконструировать координаты 3D-мира по значениям глубины в моем отложенном рендерере, но у меня чертовски мало времени. Большинство примеров, которые я нахожу в Интернете, предполагают стандартное преобразование перспективы, но я не хочу делать такое предположение.
В моем вершинном шейдере передачи геометрии я вычисляю gl_Position, используя:
gl_Position = wvpMatrix * vec4(vertexLocation, 1.0f);
и в моем фрагментном шейдере передачи освещения я пытаюсь получить мировые координаты, используя:
vec3 decodeLocation()
{
vec4 clipSpaceLocation;
clipSpaceLocation.xy = texcoord * 2.0f - 1.0f;
clipSpaceLocation.z = texture(depthSampler, texcoord).r;
clipSpaceLocation.w = 1.0f;
vec4 homogenousLocation = viewProjectionInverseMatrix * clipSpaceLocation;
return homogenousLocation.xyz / homogenousLocation.w;
}
Я думал, что угадал, и действительно, объекты рядом с камерой освещаются правильно. Но недавно я понял, что по мере того, как я удаляюсь, объекты освещаются так, как будто они находятся дальше от камеры, чем они есть на самом деле. Я поэкспериментировал со своим проходом освещения и убедился, что мои мировые координаты — единственное, что неправильно вычисляется.
Я не могу не думать, что мои clipSpaceLocation.z и clipSpaceLocation.w являются источником проблемы, но я испробовал все возможные варианты их расчета, и приведенный выше код дает наиболее правильные результаты.
Любые идеи или предложения?