WebGL空间变换以及gl_FragCoord的运用

WebGL空间变换

局部坐标系——》世界坐标系——》相机坐标系——》剪裁坐标系——》规范化设备坐标系——》屏幕坐标系

  1. 模型变换:world.xyzw = modelMatrix * position.xyzw;
  2. 视图变换::eye.xyzw = viewMaterix * world.xyzw;
  3. 投影变换:clip.xyzw = projectMatrix * eye.xyzw;
  4. 透视除法(w归1化):ndc.xyzw = clip.xyzw / clip.w;
  5. 视口变换:screen.xy = (ndc.xy + 1.0)/2.0 * viewport.wh;
  6. screen.z = (zFar - zNear)/2.0 * ndc.z + (zFar + zNear)/2.0;
    其中zNearzFar是通过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;

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值