Предполагая, что вы застряли с фиксированной конвейерной моделью, видом и проекцией, вы можете просто реализовать точно формулу, приведенную на справочной странице gluUnProject .
Там нет инверсии матрицывстроенный в GLSL, так что в идеале вы бы так, чтобы на процессоре.Таким образом, вам нужно предоставить форму, обратную вашей составной матрице modelViewProjection.gl_FragCoord находится в координатах окна, поэтому вам также необходимо указать размеры вида.
Таким образом, вы, вероятно, в конечном итоге получите что-то вроде (кодирование внешне):
vec4 unProjectedPosition = invertedModelViewProjection * vec4(
2.0 * (gl_FragCoord.x - view[0]) / view[2] - 1.0,
2.0 * (gl_FragCoord.y - view[1]) / view[3] - 1.0,
2.0 * gl_FragCoord.z - 1.0,
1.0);
Если вы 'Если вы реализовали свой собственный аналог старого стека матриц, то вы, вероятно, отлично инвертируете матрицу.В противном случае, это, возможно, более сложная тема , чем вы ожидали, и вам может быть лучше использовать реализацию MESA с открытым исходным кодом (см. Invert_matrix, третья функция в этом файле), просто потому, что этохорошо проверено, если ничего другого.