unity3d - HLSL:当我将 3x3 矩阵“挤压”成 3x2 矩阵时会发生什么?
问题描述
最初我认为这只是意味着最后一列被简单地丢弃,但显然当我进行这样的转换时,我得到了不同的结果,而不是仅仅声明一个 3x2 矩阵。
float3x3 TBN = float3x3(IN.tangent, IN.binormal, IN.normal);
float3x2 TB = float3x2(IN.tangent, IN.binormal);
half2 vNormalTBN = mul(sampledNormal, (float3x2)TBN);
half2 vNormalTB = mul(sampledNormal, TB);
解决方案
我绝对不是着色器专家,所以这只是一个非常疯狂的猜测,可能完全错误!^^
Afaik 矩阵中的组件按列(垂直)排列,看起来有点像
IN.tangent.x IN.binormal.x IN.normal.x
IN.tangent.y IN.binormal.y IN.normal.y
IN.tangent.z IN.binormal.z IN.normal.z
并且在内存方面只需按此顺序存储为 9 个浮点数。
当您显式使用float3x2
构造函数时非常相似,您会得到类似的东西
IN.tangent.x IN.binormal.x
IN.tangent.y IN.binormal.y
IN.tangent.z IN.binormal.z
但是,当您只是进行类型转换时,我怀疑您只是切断了最后 3 个浮点值并强制着色器将现在的 6 个浮点数组解释为一个新float3x2
矩阵,现在看起来像
IN.tangent.x IN.binormal.x
IN.normal.x IN.tangent.y
IN.binormal.y IN.normal.y
推荐阅读
- vue.js - 如何构建 vuejs 动态组件?
- python - 根据另一列的条件计算价格变化和价格的累积百分比变化
- python - Keras自动编码器的输入和输出层不匹配,无法运行模型
- php - 试图在laravel中获取非对象问题的属性
- scala - 为什么我在 Spark 中使用 combineByKey 的字数是值总和的两倍?
- javascript - DataTable 列过滤不提取值
- windows - 如何在启动时停止出现命令提示符?
- jbase - 在jbase中找到死代码的好方法是什么?
- python - 如何在 python 中替换 dict 中的字符
- java - 无法解析 commons-collections:commons-collections:2.1