// shaders/phong.vert #version 330 core // 输入顶点属性 layout(location = 0) in vec3 vertexPosition_modelspace; layout(location = 1) in vec3 vertexNormal_modelspace; layout(location = 2) in vec2 vertexUV; // 输出到片元着色器 out vec3 Position_worldspace; out vec3 Normal_cameraspace; out vec3 EyeDirection_cameraspace; out vec3 LightDirection_cameraspace; out vec2 UV; // Uniform 变量 uniform mat4 MVP; uniform mat4 M; uniform mat4 V; uniform vec3 lightPos_worldspace; uniform vec3 viewPos; void main(){ // 输出顶点在世界空间的位置 Position_worldspace = (M * vec4(vertexPosition_modelspace, 1)).xyz; // 顶点在相机空间的位置 vec3 Position_cameraspace = (V * M * vec4(vertexPosition_modelspace, 1)).xyz; EyeDirection_cameraspace = vec3(0,0,0) - Position_cameraspace; // 光源在相机空间的位置 vec3 LightPosition_cameraspace = (V * vec4(lightPos_worldspace, 1)).xyz; LightDirection_cameraspace = LightPosition_cameraspace - Position_cameraspace; // 法线在相机空间 Normal_cameraspace = (V * M * vec4(vertexNormal_modelspace, 0)).xyz; Normal_cameraspace = normalize(Normal_cameraspace); // 计算裁剪空间中的顶点位置 gl_Position = MVP * vec4(vertexPosition_modelspace, 1); // 传递UV坐标 UV = vertexUV; }