shaderlab - 9chapter-阴影
阅读原文时间:2023年07月14日阅读:1

原理

  • 相机和光源重合,相机能看到的表面,形成的深度图--叫做,阴影纹理(shadowMap)。

  • 传统的,用base和add更新深度信息,但是,此处需求是深度信息而已,掺杂了光的计算了,所以,unity 用特殊pass,LightMode-shadowcaster 来

  • 传统的,在光源空间比较深度。 unity在屏幕空间比较深度。(屏幕空间的阴影映射技术-ScreenSpace Shadow Map)(延迟渲染)

    1)得到阴影映射纹理和相机的深度纹理()。2)得到屏幕空间的阴影图。 ps:在阴影区域的顶点自然就可根据阴影图来采样阴影了(模型空间转换到屏幕空间),good!—可以采样是什么原理?

  • 对于普通的shader虽然看不到LightMode-shadowcaster,其实在 FallBack "Specular"(注释掉,ta就不能产生阴影了。)

shader阴影 BassPass全家桶!

//阴影0 - pragma
#pragma multi_compile_fwdbase
//阴影1 - include
#include "AutoLight.cginc"
//阴影2 - v2f
SHADOW_COORDS(2)
//阴影3 - vert
TRANSFER_SHADOW(o);
//阴影4 - frag
fixed shadow = SHADOW_ATTENUATION(i);

透明物体的阴影

fallback Transpaerent/Cuttoff/VetexLit

_Cuttoff

  • ,#include "AutoLight.cginc", 下面要的宏在此声明
  • SHADOW_COORDS(.)

  • 1 用于对阴影纹理采样的坐标。
  • 2 在顶点着色器计算上一步中声明的阴影纹理坐标
  • 3 片元着色器计算阴影值。

透明测试的阴影:

fallback 要用 Transparent/Cutout/VertexLit

要声明_Cutoff 因为上面这个兄弟用到了

-注意命名写死(TRANSFER_SHADOW 用到了。)

a2v里vertex,

v2f里pos,v

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章