En vertex shader tiene gl_Vertex (o algo más si no se utiliza la tubería fija) que es la posición de un vértice en el modelo de coordenadas. Multiplique la matriz del modelo por gl_Vertex y obtendrá la posición del vértice en las coordenadas mundiales. Asignar esto a una variable variando, y luego lea su valor en el sombreador de fragmentos y obtendrá la posición del fragmento en las coordenadas mundiales.
Ahora el problema en esto es que no necesariamente tiene una matriz de modelo si usa la matriz de vista de modelo predeterminada de OpenGL, que es una combinación de matrices de modelo y de vista. Por lo general a resolver este problema haciendo que dos matrices separadas en vez de matriz de una sola modelview:
- matriz del modelo (modelo de mapas de coordenadas a coordenadas del mundo), y
- vista de matriz (mapas del mundo en coordenadas de la cámara).
Así que simplemente pase dos matrices diferentes a su vertex shader por separado. Puede hacerlo definiendo
uniform mat4 view_matrix;
uniform mat4 model_matrix;
Al comienzo de su sombreado de vértices. Y entonces, en lugar de ftransform(), dicen:
gl_Position = gl_ProjectionMatrix * view_matrix * model_matrix * gl_Vertex;
En el programa principal debe escribir valores en estos dos nuevas matrices. Primero, para obtener la matriz de vistas, realice las transformaciones de la cámara con glLoadIdentity(), glTranslate(), glRotate() o gluLookAt() o lo que prefiera como lo haría normalmente, pero luego llame a glGetFloatv (GL_MODELVIEW_MATRIX, & matriz); para obtener los datos de la matriz en una matriz. Y en segundo lugar, de manera similar, para obtener la matriz del modelo, también llame a glLoadIdentity(); y hacer las transformaciones del objeto con glTranslate(), glRotate(), glScale() etc. y finalmente llamar a glGetFloatv (GL_MODELVIEW_MATRIX, & matriz); para obtener los datos de la matriz de OpenGL, para que pueda enviarlos a su vertex shader. Tenga en cuenta especialmente que debe llamar a glLoadIdentity() antes de comenzar a transformar el objeto. Normalmente, primero se transformaría la cámara y luego se transformaría el objeto, lo que daría como resultado una matriz que realiza las funciones de vista y modelo. Pero debido a que está utilizando matrices separadas, debe restablecer la matriz después de las transformaciones de la cámara con glLoadIdentity().
gl_FragCoord son las coordenadas de píxel y no las coordenadas del mundo.
no se multiplican por su gl_ModelViewMatrix. – Hannesh