DOT3 照明通常称为每像素照明。使用顶点照明时,会在每个顶点计算照明,并将所得照明插值到三角形上。在每像素照明中,顾名思义,目标是计算每个像素的照明。
在 iPhone 等固定功能硬件上完成此操作的方式是使用所谓的寄存器组合器。 DOT3 这个名字来自这个渲染状态:
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_DOT3_RGB);
Look at this沃尔夫冈·恩格斯 (Wolfgang Engels) 博客上的博客条目了解有关如何设置的更多信息。
在进行逐像素照明时,通常还使用所谓的法线贴图。这意味着对象上每个点的法线都存储在特殊的纹理贴图(法线贴图)中。这在《DOOM 3》游戏中通过 ID 软件得到普及,其中使用了相当低的多边形模型,但具有高分辨率法线贴图。使用这种技术的原因是眼睛对光线的变化比形状的变化更敏感。
我在你的另一个问题中看到,出现这种情况的原因是你想减少顶点数据的内存占用。确实如此,您只需将纹理坐标的两个分量存储到法线贴图,而不是在每个顶点中存储法线的三个分量。启用每像素照明会带来性能成本,所以我不确定这是否会是一个净胜利,像往常一样,建议是尝试看看。
最后,一个点的漫射照明强度与表面法线和光方向之间的角度的余弦成正比。对于两个向量点积 is defined as:
a dot b = |a||b| cos(theta)
where |a|
and |b|
是向量的长度a
and b
分别和theta
是它们之间的角度。如果长度等于一,|a|
and |b|
被称为单位向量,公式简化为:
a dot b = cos(theta)
这意味着漫射照明强度由表面法线和光方向之间的点积给出。这意味着all漫射照明是 DOT3 照明的一种形式,即使该名称已指的是每像素类型。