【WebGL】ShadowMap实现阴影原理

假如场景中有一个平面和三角形,实现阴影的步骤和原理如下:

1.以灯光为相机视角渲染平面和三角形,记录片元的深度信息到gl_FragColor

<script id="vs1" type="x-shader/x-vertex">
  attribute vec4 a_Position;
  uniform mat4 u_PvMatrix;
  uniform mat4 u_ModelMatrix;
  void main(){
    gl_Position=u_PvMatrix*u_ModelMatrix*a_Position;
  }
</script>
<script id="fs1" type="x-shader/x-fragment">
  precision mediump float;
  void main(){
    gl_FragColor=vec4(gl_FragCoord.z,0.0,0.0,0.0);
  }
</script>

2.以相机为视角进行渲染三角形和平面,着色器如下

这里就是当前模型同一个点取得灯光视角空间的深度和在相机视角下的深度,进行对比(当前片元在投影贴图中所对应的片元)

之所以要先取灯光视角空间的所有模型的深度信息(上一步的帧缓存),是当前渲染的时候只能取得自己得深度

参考

https://juejin.cn/post/7067424409065095205

webgl2fundamentals的两个教程比较好,其中纹理投射那篇和上面那篇对应着看,对纹理映射也能加深理解
https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl-shadows.html
https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl-planar-projection-mapping.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: WebGL 是一种基于 JavaScript 和 OpenGL 的 3D 图形库,它可以在 Web 浏览器中渲染 3D 图形,从而实现浏览器中的 3D 视觉效果。实现阴影效果可以使用 WebGL 中的阴影映射技术,简单来说,就是在场景中添加光源,然后从光源的角度渲染场景,生成一张深度图,再将深度图应用到场景中的物体上,就可以实现阴影效果了。同时,还可以使用其他技术,例如环境映射和法线映射,来增强场景的真实感和深度感。总之,WebGL 提供了丰富的工具和技术,使得在 Web 浏览器中实现 3D 阴影效果成为可能。 ### 回答2: WebGL是一种基于Web的图形渲染技术,可以实现高性能的3D图形渲染。要实现阴影效果,可以借助WebGL的功能来完成。 首先,要实现阴影效果,需要一个光源。在WebGL中,可以通过设置光源的位置和方向来控制光的照射效果。 其次,还需要一个或多个需要投射阴影的物体。通过在渲染过程中为这些物体添加一个额外的"shadow"属性,可以标识它们需要投射阴影。 然后,在渲染阴影之前,需要创建一个用于渲染阴影的额外场景。在该场景中,只包含需要投射阴影的物体。这个场景可以使用一个特殊的着色器来渲染,这个着色器和其他场景使用的着色器可能稍有不同,因为它只关注渲染阴影而不需要考虑光照。 接下来,在渲染主场景之前,需要对每个需要投射阴影的物体进行阴影计算。这可以通过使用光源的位置和方向来确定每个像素是否在阴影之中。可以使用阴影映射技术(Shadow Mapping)来完成这个计算过程,这个过程涉及渲染一个特殊的深度贴图来表示场景中的深度信息。 最后,在主场景渲染过程中,可以使用计算得到的阴影信息来对物体进行阴影投射。可以使用对阴影贴图进行采样的方式,来判断像素是否位于阴影之中。 综上所述,WebGL通过设置光源、创建阴影场景、进行阴影计算和使用阴影信息投射,可以实现3D场景中的阴影效果。 ### 回答3: WebGL是一种在网页浏览器上运行3D图形的技术,它使用JavaScript和OpenGL的子集来实现。要实现阴影效果,我们可以借助WebGL的着色器程序和纹理功能。 首先,为了产生阴影,我们需要一个光源。可以使用WebGL的光照功能来定义光源的位置和类型,例如平行光或点光源。 接下来,我们需要为阴影接收器(即产生阴影的物体)和阴影投射器(即光源)创建阴影贴图。阴影贴图是一个与场景大小相同的二维纹理,它记录了物体与光源之间的相对位置关系。 然后,我们需要通过在阴影投射器和阴影接收器之间进行渲染来生成阴影贴图。我们可以使用投射阴影的算法,如阴影映射或体积光,来计算每个像素的阴影强度。 在渲染阶段,我们可以在顶点着色器和片段着色器中应用阴影贴图。顶点着色器将物体的顶点位置转换为世界坐标和光源坐标,并将它们传递给片段着色器。片段着色器使用阴影贴图来计算每个像素的阴影强度,并将其与物体的颜色进行混合。 最后,我们可以通过在片段着色器中使用深度测试来控制阴影的渲染顺序,并使用透明度来调整阴影的强度和透明度。 总体来说,WebGL通过使用光照、阴影贴图和着色器程序来实现阴影效果。这样可以使3D场景更加逼真和生动,并增强用户对物体之间关系的认知。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值