我正在尝试开发一个片段着色器,它淡入0,其中面部法线垂直于玩家“相机”的方向。(这是针对球形行星大气;我希望它们在外部范围内消失)。
我设置了游戏,以便玩家始终处于“宇宙位置”0、0、0 处,并且所有对象在玩家移动时都会在玩家周围平移其 transform.matrix3D。
我应该指出,我有多个着色器工作正常,其中一些包括混合纹理、在 2 个模型之间插值和镜面着色;但是,这个问题让我打败了。
我一直认为片段着色器需要知道玩家的方向(以便它可以在当前面法线和玩家方向之间进行点积)。但是,它还需要将模型的“当前”顶点位置(即着色器当前正在绘制的顶点输出位置)添加到反向玩家相机方向上;这样,从该模型表面位置到相机的方向将是正确的。
好吧,显然不是。(我可以解释我一直在做什么,但我可以感觉到人们已经忽略了这个问题......)。鉴于我还需要包括(我认为)模型的顶点位置与模型的中心位置“偏移”的事实,谁能告诉我如何正确计算玩家的方向?这一直让我头疼!
谢谢。
编辑
这是相关的 AS3 代码,后面是 AGAL:
// invMatrix is a cloned and inverted copy of the Planet object's transform.matrix3D...
// .deltaTransformVector ONLY uses the matrix3D's rotation to rotate a vector3D...
var tempVector:Vector3D = invMatrix.deltaTransformVector(transform.matrix3D.position);
tempVector.normalize();
context3D.setProgramConstantsFromVector(Context3DProgramType.VERTEX, 5, Vector.<Number>([-tempVector.x, -tempVector.y, -tempVector.z, 0]));
context3D.setProgramConstantsFromMatrix(Context3DProgramType.VERTEX, 7, rotMatrix, true);
... other constants set here ...
context3D.setVertexBufferAt(3, mesh.normalsBuffer, 0, Context3DVertexBufferFormat.FLOAT_3);
在顶点着色器中:
"m44 v3, va3, vc7 \n" + // passed rotMatrix is used to rotate the face normals
"dp3 v4, vc5, va3 \n" + // put the dot product of the normalised, rotated camera position and the rotated normal in v4
然后,在片段着色器中:
"mul ft0, ft0, v4 \n" + // multiply the sampled texture in ft0 by the passed dot product in v4
但这一切都导致了一些奇怪的渲染行为,其中一半的大气似乎被绘制,这取决于你相对于地球的位置。莫名其妙。任何帮助都非常感谢。