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