【发布时间】:2021-04-02 18:56:56
【问题描述】:
在 OpenGL 着色语言 (GLSL) 中谈论凹凸贴图、镜面高光和这类东西
我有:
- 顶点数组(例如 {0.2,0.5,0.1, 0.2,0.4,0.5, ...})
- 法线数组(例如 {0.0,0.0,1.0, 0.0,1.0,0.0, ...})
- 点光源在世界空间中的位置(例如 {0.0,1.0,-5.0})
- 观察者在世界空间中的位置(例如 {0.0,0.0,0.0})(假设观察者在世界的中心)
现在,如何计算每个顶点的 Binormal 和 Tangent?我的意思是,计算 Binormals 的公式是什么,我必须根据这些信息使用什么?关于切线?
无论如何我都会构造 TBN 矩阵,所以如果你知道一个公式来直接基于这些信息构造矩阵会很好!
哦,是的,如果需要,我也有纹理坐标。 正如我所说的 GLSL,每个顶点的解决方案会很好,我的意思是,一个不需要一次访问多个顶点信息的解决方案。
---- 更新-----
我找到了这个解决方案:
vec3 切线; vec3 副法线; vec3 c1 = cross(a_normal, vec3(0.0, 0.0, 1.0)); vec3 c2 = cross(a_normal, vec3(0.0, 1.0, 0.0)); 如果(长度(c1)>长度(c2)) { 切线 = c1; } 别的 { 切线 = c2; } 切线 = 归一化(切线); 副法线=交叉(v_nglNormal,切线); 副常态=归一化(副常态);但我不知道它是否 100% 正确。
【问题讨论】:
-
可能是gamedev.stackexchange.com 的问题?
-
@user464230:不,这里也可以。 3D 图形不仅限于游戏。
-
该“解决方案”假设您将在法线 = x 的平面上应用法线贴图纹理。如果应用于任意模型,这将不起作用。你真正需要做的是求解我给你的每个面的方程组,并使用顶点的平均值。如果你想做严肃的 3D 编程,你必须学习如何将线性代数(如下所示)转化为源代码。
-
“如果你想做严肃的 3D 编程,你必须学习如何将线性代数 - 如下所示 - 翻译成源代码。”......伙计,真的,你不会见不到我!!!不要告诉我“你会学习”……你根本不知道我做了什么……小心你的言辞!
-
@user464230:不,我不知道你实际做了什么。但是您询问了如何计算切线和副法线。所以你可以期待的是这个过程的数学描述。如果你只是想要一些源代码,你可以复制和粘贴,好吧,那里有很多。但是要了解如何有效地使用它,您必须了解它在数学层面上的作用。这需要您学习阅读和理解线性代数。你提出问题和评论我的帖子的方式清楚地表明,你还没有学会如何正确地阅读数学。
标签: math opengl 3d glsl shader