我从一个普通球体开始,需要将其变形为椭圆形。我通过拉伸一个轴来实现这一点,在我的代码中,这个轴将是y轴。
mat4 ToOvalMat = mat4(vec4(1., 0., 0., 0.),
vec4(0., 1.5, 0., 0.),
vec4(0., 0., 1., 0.),
vec4(0., 0., 0., 1.));
我将其拉伸1.5乘以一个名为a的输入。这对我的意图很有效,但我仍然需要找到一个好的方法来修复法线并获得适当的阴影,因为它们仍然与原始球体绑定。
在谷歌上寻找答案后,我找到了GPU宝石-变形器,它与法线有关,但我不太理解解释的概念。Jacobian矩阵似乎能够解决我的法线问题,但我不太确定,我希望得到一些关于我的计算的帮助或反馈,因为在我给定的测试程序中很难从渲染中看到。
由于我在y维度上拉伸,我有一个大小为4的正规单位矩阵,其中我只将y1替换为1.5a。如果我正确理解文本,这将是我的雅可比矩阵反转,然后转座这个矩阵就是我将法线乘以的矩阵。我也可以在ShadowMatrix上使用它吗?
Normal = (transpose(inverse(ToOvalMat)) * vec4(VertexNormal, 0.)).xyz;
Normal = normalize((ViewMatrix * WorldMatrix * vec4(Normal, 0.)).xyz);
我从这些计算中得到了一些工件,他们并没有完全为我推销可信度,这让我觉得我的矩阵或其他东西出了问题。我完全猜到了ShadowMatrix,因为到目前为止我一直被困在法线上,所以我还没有对它进行足够的研究。
我不确定阴影矩阵部分。对于法线,在顶点着色器中计算反转/转置是非常浪费的。这意味着矩阵可能是为每个顶点计算的。如果你幸运的话,它可能会被优化掉,但我宁愿自己不要指望它。
更干净的方法IMHO是将单独的法线变换矩阵传递到着色器中,并使用它来变换法线。这可以是一个3x3矩阵(更多背景信息,请参阅我的答案:OpenGL ES 2.0安卓系统:normalMatrix应该有什么尺寸?)。
然后,您将在CPU上计算自己的代码中的反转/转置。对于非均匀缩放,逆矩阵是一个包含缩放因子逆的缩放矩阵,对其进行换位不会有任何作用。例如:
mat3 ToOvalNormalMat = mat3(vec3(1.0f, 0.0f, 0.0f),
vec3(0.0f, 1.0f / 1.5f, 0.0f),
vec3(0.0f, 0.0f, 1.0f));
有关如何计算非均匀缩放的法线矩阵的更多详细信息,请参见非均匀缩放中的法线矩阵。