切线空间计算法线贴图——Vertex Shader转换光照变量

背景

根据切线空间的理论,可以得到TBN矩阵用于将点从世界空间变化到切线空间。使用法线纹理时,可以将光照变量变换到切线空间(使用 T B N − 1 TBN^{-1} TBN1)也可以将切线空间采样到的法线变换到世界空间(使用 T B N TBN TBN)。使用第一种方法的优势是可以把原本在Fragment Shader(fs)中的计算移到Vertex Shader(vs)中进行计算,这里做一下简单的推导。

推导

每个顶点有其各自的光照变量,这里以viewDir,从顶点到相机的向量为例。同时三个顶点共用一个TBN矩阵

如果是在fs中进行计算,上述的变量在经过传递时会被进行透视校正插值,这里不考虑具体的系数计算方法,假设系数为 α , β , γ \alpha, \beta, \gamma α,β,γ.

那么,fs中的viewDir为:

v i e w D i r p = α ⋅ v i e w D i r A + β ⋅ v i e w D i r B + γ ⋅ v i e w D i r C viewDir_p = \alpha\cdot viewDir_A + \beta \cdot viewDir_B + \gamma \cdot viewDir_C viewDirp=αviewDirA+βviewDirB+γviewDirC

T B N − 1 ⋅ v i e w D i r p = α ⋅ T B N − 1 ⋅ v i e w D i r A + β ⋅ T B N − 1 ⋅ v i e w D i r B + γ ⋅ T B N − 1 ⋅ v i e w D i r C TBN^{-1} \cdot viewDir_p = \alpha\cdot TBN^{-1} \cdot viewDir_A + \beta \cdot TBN^{-1} \cdot viewDir_B + \gamma\cdot TBN^{-1} \cdot viewDir_C TBN1viewDirp=αTBN1viewDirA+βTBN1viewDirB+γTBN1viewDirC

而在vs中计算:

v i e w D i r A ′ = T B N − 1 ⋅ v i e w D i r A v i e w D i r B ′ = T B N − 1 ⋅ v i e w D i r B v i e w D i r C ′ = T B N − 1 ⋅ v i e w D i r C viewDir_A'= TBN^{-1} \cdot viewDir_A \\ viewDir_B'= TBN^{-1} \cdot viewDir_B \\ viewDir_C'= TBN^{-1} \cdot viewDir_C viewDirA=TBN1viewDirAviewDirB=TBN1viewDirBviewDirC=TBN1viewDirC

从而在fs中我们会得到:

v i e w D i r p ′ = α ⋅ v i e w D i r A ′ + β ⋅ v i e w D i r B ′ + γ ⋅ v i e w D i r C ′ = α ⋅ T B N − 1 ⋅ v i e w D i r A + β ⋅ T B N − 1 ⋅ v i e w D i r B + γ ⋅ T B N − 1 ⋅ v i e w D i r C viewDir_p' = \alpha\cdot viewDir_A' + \beta \cdot viewDir_B' + \gamma \cdot viewDir_C' \\ = \alpha\cdot TBN^{-1} \cdot viewDir_A + \beta \cdot TBN^{-1} \cdot viewDir_B + \gamma\cdot TBN^{-1} \cdot viewDir_C viewDirp=αviewDirA+βviewDirB+γviewDirC=αTBN1viewDirA+βTBN1viewDirB+γTBN1viewDirC

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值