对我的问题的回答表明 DOT3 光照可以帮助 OpenGL ES 渲染,但我很难找到关于什么是 DOT3 光照的正确定义。
编辑 1
非常感谢 iPhone 相关信息。
DOT3 光照通常被称为逐像素光照。使用顶点光照计算每个顶点的光照,并在三角形上插值得到光照。在逐像素光照中,顾名思义,目标是计算每个像素的光照。
这是在固定功能硬件上完成的方式,就像 iPhone 使用所谓的寄存器组合器一样。DOT3 的名称来自此渲染状态:
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_DOT3_RGB);
查看 Wolfgang Engels 博客上的此博客条目,了解有关如何设置的更多信息。
在进行逐像素光照时,也很流行使用所谓的法线贴图。这意味着对象上每个点的法线都存储在一个特殊的纹理贴图中,即法线贴图。这在游戏 DOOM 3 中由 ID 软件推广,其中使用了相当低的多边形模型,但具有高分辨率的法线贴图。使用这种技术的原因是眼睛对光线变化比对形状变化更敏感。
我在您的另一个问题中看到,出现这种情况的原因是您想减少顶点数据的内存占用。确实如此,您只需将纹理坐标的两个分量存储到法线贴图,而不是在每个顶点中为法线存储三个分量。启用每像素照明会带来性能成本,所以我不确定这是否会是一个净赢,像往常一样,建议是尝试看看。
最后,一个点的漫反射光照强度与表面法线和光的方向之间的夹角的余弦成正比。对于两个向量,点积定义为:
a dot b = |a||b| cos(theta)
其中|a|
和|b|
是向量的长度,a
和b
分别theta
是它们之间的角度。如果长度等于 1,|a|
则|b|
称为单位向量,公式简化为:
a dot b = cos(theta)
这意味着漫反射光照强度由表面法线和光的方向之间的点积给出。这意味着所有漫反射照明都是 DOT3 照明的一种形式,即使这个名称已经指代每像素类型。
从这里:
凹凸贴图是在模型上放置纹理,其中每个纹素的亮度定义了该纹素的高度。
然后使用每个纹素的高度来扰动整个表面的光照。
法线贴图是在模型上放置一个纹理,其中每个纹理像素的颜色实际上是三个值,这些值定义了表面点上的位置方向。
例如,颜色为 (255, 0, 0) 可能意味着该位置的表面指向正 X 轴。
换句话说,每个纹素都是法线。
Dot3 名称来自您对这些法线的实际操作。
假设您有一个向量,它指向您的光源指向的方向。假设你有一个向量,它是模型上特定纹素的法线,它告诉你纹素指向的方向。
如果你在这两个法向量上做一个称为“点积”的简单数学方程,如下所示:
点 = N1x N2x + N1y N2y + N1z*N2z
然后结果值是一个数字,它告诉您这两个向量指向同一方向的程度。
如果值为-1,那么它们指向相反的方向,这实际上意味着纹素指向光源,而光源指向纹素,所以纹素应该被点亮。
如果值为 1,则它们指向同一方向,这意味着纹素指向远离光源。
如果值为 0,则其中一个向量相对于另一个向量指向 90 度。即:如果您站在地面上向前看,那么您的视图矢量相对于指向上方的地面法线是 90 度。