在顶点着色器与片段着色器中计算TBN矩阵?

用户2331095

我认为我们可以在顶点着色器和片段着色器中计算TBN矩阵。

// calculate in vs
varying mat3 vTbnMatrix;
void main() {
  vec3 n = normalMatrix * aNormal;
  vec3 t = normalMatrix * vec3(aTangent.xyz);
  vec3 b = cross(n, t) * aTangent.w;
  vTbnMatrix = mat3(t, b, n);
}

// calculate in fs
varying vec3 vNormal; // transformed by normalMatrix
varying vec3 vTangent; // transformed by normalMatrix
varying vec3 vBitantent;
void main() {
  mat3 tbnMatrix = mat3(vTangent, vBitangent, vNormal);
}

有什么不同?我认为我们可以在顶点着色器中计算TBN矩阵,因为它可以加快程序的速度。

但是,当我深入研究THREE.js和PlayCanvas引擎的源代码时,它们都在片段着色器中计算TBN矩阵。

在片段着色器中进行计算有什么优势?

西兰吉

理论上,TBN矩阵应该是正交的。

在three.js中,法线,切线和双切线作为变量传递,插值到图元的表面,重新规格化,然后在片段着色器中构造TBN矩阵。这样,矩阵列为(1)单位长度,并且(2)可能接近正交。

您可以在片段着色器中计算双切线,强制其与插值法线和切线正交,但是这样做可能不会产生太大差异,因为插值法线和切线始终不能保证正交。

three.js r.102

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

顶点着色器与片段着色器

如何通过顶点着色器将数据从顶点着色器传递到片段着色器

片段着色器如何确定来自顶点着色器输出的片段数?

优化片段和顶点着色器之间的操作

了解来自顶点着色器的片段着色器输入

警告:片段着色器不会读取顶点着色器“ v_gradient”的输出

顶点着色器或片段着色器中的OpenGL ES2.0 Lighting

如何在Metal中将数组从顶点着色器传递到片段着色器

OpenGL无法将变量从顶点着色器发送到片段着色器

OpenGL顶点着色器处理

WebGL:是否禁止在顶点着色器和片段着色器中绑定相同的制服?

此WebGL程序中的顶点着色器和片段着色器之间何时进行插值?

GLSL从“片段着色器”到“顶点着色器”发送颜色数据似乎总是等于0

在glsl 3.3中将浮点数组从顶点着色器传递到片段着色器

Threejs:在片段着色器中计算投影坐标

如果几何着色器处于活动状态,如何将信息从顶点着色器传递到片段着色器?

是否可以使用具有或不具有几何体着色器的相同顶点着色器和片段着色器?

顶点着色器中的广告牌顶点

丢弃Unity的顶点着色器中的顶点

如何在顶点着色器外部将顶点与模型矩阵相乘

顶点着色器和像素着色器有什么关系?

顶点着色器中的Phong照明

在Threejs中使用顶点着色器旋转几何

像素和顶点着色器中的缩放问题

顶点着色器中的边界框

从顶点着色器读取变量以在 webgl 中呈现

编译顶点着色器程序失败

在顶点着色器中移动/旋转形状

在OpenGL的顶点着色器中获取元素ID