В вершинном шейдере у вас есть 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, &); чтобы получить матричные данные в массив. А во-вторых, аналогичным образом, чтобы получить матрицу модели, также вызовите glLoadIdentity(); и выполните преобразования объектов с glTranslate(), glRotate(), glScale() и т. д. и, наконец, вызовите glGetFloatv (массив GL_MODELVIEW_MATRIX, &); чтобы получить данные матрицы из OpenGL, чтобы вы могли отправить их в свой шейдер вершин. Особенно обратите внимание, что вам нужно вызвать glLoadIdentity(), прежде чем начать преобразовывать объект. Обычно вы сначала должны преобразовывать камеру, а затем преобразовывать объект, который приведет к одной матрице, которая выполняет как функцию представления, так и модели. Но поскольку вы используете отдельные матрицы, вам необходимо сбросить матрицу после преобразования камеры с помощью glLoadIdentity().
gl_FragCoord - координаты пикселя, а не координаты мира.
Не умножать по вашей gl_ModelViewMatrix. – Hannesh