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