我从一个正常的球体开始,我需要变形成一个椭圆形的形状。我是通过拉伸一个轴来做到这一点的,在我的代码中,这个轴就是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宝石-变形金刚,它与法线有关,但我不太理解解释的概念。雅可比矩阵似乎可以解决我的法线问题,但我不太确定,并希望得到某种帮助或反馈我的计算,因为这是很难从渲染在我给定的测试程序。
因为我在y维中拉伸,所以我有一个大小为4的正常单位矩阵,其中我只是用1.5a替换y 1。这将是我的雅可比矩阵,如果我理解正确的文本。逆,然后转置这个矩阵,然后我会用我的法线相乘。我也可以在我的ShadowMatrix上使用这个吗?
Normal = (transpose(inverse(ToOvalMat)) * vec4(VertexNormal, 0.)).xyz;
Normal = normalize((ViewMatrix * WorldMatrix * vec4(Normal, 0.)).xyz);通过这些计算,我得到了一些人工制品,它们并没有为我完全出售它的可信度,这让我觉得有些东西与我的矩阵或其他东西脱节。我完全猜到了ShadowMatrix,因为到目前为止,我还没有对它进行足够的研究,因为我一直被困在法线上。
发布于 2015-04-21 15:49:56
我不确定影子矩阵部分。对于法线,计算顶点着色器中的逆/转置是非常浪费的。这意味着矩阵可能是为每个顶点计算的。如果你幸运的话,这可能会被优化,但我不想指望它自己。
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));有关如何计算非均匀缩放的正常矩阵的更多详细信息,请参见非均匀标度的正规矩阵。
https://stackoverflow.com/questions/29769702
复制相似问题