WebGL空间变换
局部坐标系——》世界坐标系——》相机坐标系——》剪裁坐标系——》规范化设备坐标系——》屏幕坐标系
- 模型变换:world.xyzw = modelMatrix * position.xyzw;
- 视图变换::eye.xyzw = viewMaterix * world.xyzw;
- 投影变换:clip.xyzw = projectMatrix * eye.xyzw;
- 透视除法(w归1化):ndc.xyzw = clip.xyzw / clip.w;
- 视口变换:screen.xy = (ndc.xy + 1.0)/2.0 * viewport.wh;
- screen.z = (zFar - zNear)/2.0 * ndc.z + (zFar + zNear)/2.0;
其中zNear、zFar是通过gl.depthRange指定的从规范化设备坐标哦到屏幕坐标的深度范围映射值,默认为[0.0, 1.0].
gl_FragCoord
含义:片元在帧缓冲画面的相对位置,其中gl_FragCoord.xy是片元的窗口坐标,注意它们的小数部分恒为0.5,[x-0.5, y-0.5]位于[0, viewport.wh]之间,viewport.wh以像素为单位,是通过gl.viewport指定的视口宽高.gl_FragCoord.z是固定管线计算出的当前片元的深度值,位于[0.0,1.0]之间.gl_FragCoord.w是剪裁空间clip.w的倒数.透视投影中,当前片元在相机坐标系中与相机之间的距离:gl_FragCoord.z/gl_FragCoord.w
gl_FragCoord反推各坐标系坐标
ndc坐标:ndc.xyzw = (gl_FragCoord.xy / viewport.wh * 2.0 - 1.0, glFragCoord.z * 2.0 - 1.0, 1.0);
剪裁坐标:clip.xyzw = ndc.xyzw * ndc.w;(还原透视除法)
视坐标:eye.xyzw = projectionMatrixInverse * ndc.xyzw;
世界坐标:world.xyzw = viewMatrixInverse * eye.xyzw;
局部坐标:position.xyzw = modelMatrixInverse * world.xyzw;