如何计算从点精灵球reflection向量?

到目前为止,我已经完成了本教程之后的建立立方体地图 然后,我使用glDrawArrays(GL_POINTS,0,3)绘制了三个点,并基于一个球体计algorithm线。

为了计算入射光的方向和reflectionvector,我需要表面位置。 我的问题是

  1. 我需要每个片段的视图空间或世界空间坐标吗?
  2. 如何计算每个片段的表面位置?
  3. 计算照明在视空间和世界空间之间有什么区别?

忘了提及这是我计算球体的法线的方式

vec3 N; N.xy = gl_PointCoord * 2.0f - 1.0f; float mag = dot(N.xy,N.xy); if(mag > 1.0f) discard; Nz = sqrt(1.0f - mag); N = normalize(N); 

表面位置是法线自身乘以球体(点精灵)的大小加上球体的原点。

请记住,精灵是一个球体的中心,而不是它的表面,所以会有一些轻微的错误,因为没有考虑到透视投影,但是当我们使用点精灵进行作弊时,这是一致的。 (对平行(正)投影来说它是完美的)

如果仔细观察,你会发现reflection/光照问题,但是它落入了足够接近的范畴,而且在微小的“球体”上看不到。

在这里输入图像说明

你可以解决这个问题,但是大概会把着色器的成本加倍。

请注意,这个例子是非常极端的,玩家的鼻子离球体大约10厘米(3英寸),视角越“平行”,误差越小。 如果这很重要,那么当摄像机靠近或使用着色器校正时,可能应该切换到常规的球形网格,而只能在靠近摄像机的位置使用。

情况变得更加复杂,偏离中心的点精神:

在这里输入图像说明

也就是说,点子弹对于子弹地狱射手和复古的感觉,以及对球体(行星,星星,巨石,灌木丛,树叶等等)的遥远近似都非常酷。 只是不要花费太多的精力在特写的情况下让它们看起来像完美的领域,GPU将花费更多的时间在这个方面,而不是一堆简单的三角形。

如果你想让Mario64带有巨型点精灵的复古感,你不需要纠正它们,而且如果你需要好看的球体,那么只使用点精灵来做小于32甚至16像素半径的球体,以及不同的实际3D网格相机越来越近,越来越大的球体的细节层次。

使用点精灵的原因是,当多边形的尺寸小于8×8像素时,由于工作方式的原因,许多GPU开始浪费大量的顶点和像素着色能力。 在像素着色器单元被分组为N×M个像素(通常是8×8或8×4)的情况下,必须为每个可能只有1到4个实际像素的三角形处理完整的N×M个像素。 一些GPU有一些技巧来帮助解决这个问题,但不是全部,而且你正在处理大量像素的顶点。 我将在这里停下来,因为它几乎是无关紧要的,但是值得解释为什么点精灵/广告牌仍然有用。