В вершинном шейдере у вас есть gl_Vertex (или что-то еще, если вы не используете фиксированный конвейер), который является положением вершины в координатах модели.Умножьте матрицу модели на gl_Vertex, и вы получите положение вершины в мировых координатах.Присвойте это переменной варьирующейся , а затем прочитайте ее значение в фрагментном шейдере, и вы получите положение фрагмента в мировых координатах.
Теперь проблема в том, что вы надеваетене обязательно иметь какую-либо матрицу модели, если вы используете матрицу представления модели по умолчанию OpenGL, которая является комбинацией как модели, так и матрицы представления.Обычно я решаю эту проблему, имея две отдельные матрицы вместо одной матрицы вида модели:
- матрица модели (сопоставляет координаты модели с мировыми координатами) и
- матрица вида (сопоставляет мировые координаты).к координатам камеры).
Так что просто передайте две разные матрицы в ваш вершинный шейдер отдельно.Вы можете сделать это, определив
uniform mat4 view_matrix;
uniform mat4 model_matrix;
в начале вашего вершинного шейдера.И тогда вместо ftransform () произнесите:
gl_Position = gl_ProjectionMatrix * view_matrix * model_matrix * gl_Vertex;
В основной программе вы должны записать значения в обе эти новые матрицы.Во-первых, чтобы получить матрицу вида, выполните преобразования камеры с помощью glLoadIdentity (), glTranslate (), glRotate () или gluLookAt () или того, что вы предпочитаете, как обычно, но затем вызовите glGetFloatv (GL_MODELVIEW_MATRIX, & array);для того, чтобы получить данные матрицы в массив.И во-вторых, аналогичным образом, чтобы получить матрицу модели, также вызовите glLoadIdentity ();и выполнить преобразования объектов с помощью glTranslate (), glRotate (), glScale () и т. д. и, наконец, вызвать glGetFloatv (GL_MODELVIEW_MATRIX, & array);чтобы получить данные матрицы из OpenGL, чтобы вы могли отправить их в ваш вершинный шейдер.Особенно обратите внимание, что вам нужно вызвать glLoadIdentity () перед началом преобразования объекта.Обычно вы сначала преобразуете камеру, а затем преобразуете объект, в результате чего получится одна матрица, которая выполняет функции вида и модели.Но поскольку вы используете отдельные матрицы, вам необходимо сбросить матрицу после преобразований камеры с помощью glLoadIdentity ().
gl_FragCoord - это координаты пикселей, а не мировые координаты.