2023-04-10 glsl将屏幕坐标转换为世界坐标

104 阅读1分钟
vec3 calcWorldNormal(vec2 screenCoord, float depth, mat4 invProjMat, mat4 invViewMat) {
    // 转换为裁剪空间坐标
    vec4 clipCoord = vec4(screenCoord, depth, 1.0);
    clipCoord = clipCoord * 2.0 - 1.0;
    // 将裁剪空间坐标转换为视图空间坐标
    vec4 viewCoord = invProjMat * clipCoord;
    viewCoord /= viewCoord.w;
    // 将视图空间坐标转换为世界空间坐标
    vec4 worldCoord = invViewMat * viewCoord;
    vec3 position = worldCoord.xyz / worldCoord.w;
    // 计算法线向量
    vec3 normal = normalize(position);
    return normal;
}