46 lines
1.3 KiB
GLSL
46 lines
1.3 KiB
GLSL
// 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;
|
|
}
|
|
|