0

我正在尝试开发一个片段着色器,它淡入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

但这一切都导致了一些奇怪的渲染行为,其中一半的大气似乎被绘制,这取决于你相对于地球的位置。莫名其妙。任何帮助都非常感谢。

4

2 回答 2

1

你需要找到从顶点到空间中某个点的向量吗?如果是这样,您只需要在一个框架中工作,例如在世界框架中。为此,您需要知道世界空间中的所需位置,并且需要将顶点转换为世界空间(只需乘以模型矩阵)。

于 2013-11-27T07:51:07.063 回答
0

好的 - 谢谢,Volgogradetzzz,您的回复;你绝对让我放心,我在思考正确的“方向”。它最终成为同时纠正许多事情的问题。我最终得到:
1)将相对的、未旋转的摄像机位置传递给着色器。
2)通过对象的旋转矩阵(包括比例,但不包括位置平移)旋转顶点着色器中的顶点和法线缓冲区
3)最后,关键是从片段中的相机位置减去旋转的顶点位置着色器
所以 - 它终于工作了!(好吧,那是我生命中的一周,我永远不会回来)。

于 2013-12-03T12:47:53.270 回答