我目前正在寻找有关如何在点亮的3D场景中获取给定面部的最终平面颜色值的信息。我有一个Material类,它包含以下4种颜色:
环境,镜面,漫反射和发射
我的Color类有简单混合效果的方法,例如add,multiply等
从灯光列表,相机位置,材质,脸部正常&面子位置。我想使用标准的4色材料模型,使用软件渲染管道计算要填充的面的最终颜色。
答案 0 :(得分:3)
我假设你想要固定功能GL使用的标准Phong或Blinn-Phong照明模型。
发射术语是材料自身发出的颜色(例如,在建模灯光时)。所以它只是增加了最终的颜色。
color = emissive;
环境术语模拟由无限反射光引起的间接照明计算,因此它不依赖于光的位置,并且几乎无处不在。因此,材质的环境只是乘以灯光的颜色,并添加到最终颜色。
color += ambient * lightColor;
漫反射词模拟标准朗伯反射器,它在所有方向上均匀地反射光。它取决于光线方向与表面法线之间的角度,角度越小,光线越多。
lightDir = normalize(lightPos-facePos);
color += dot(lightDir, normal) * diffuse * lightColor;
镜面术语最终模拟镜面反射,将更多的光反射到单一方向(完美的反射方向)。所以它取决于你在脸上看的方向。此外,反射率取决于描述表面粗糙度的另一个参数(或实际上它的光泽,也是GL使用的名称,更高的值使得更清晰的亮点因此是更“闪亮”)。
viewDir = normalize(cameraPos-facePos);
halfVec = normalize(lightDir+viewDir);
color += pow(dot(normal, halfVec), shininess) * specular * lightColor;
当然,必须为每一盏灯计算环境,漫反射和镜面反射术语。
对于除了没有距离衰减的简单点光源之外的更复杂的灯光,你必须考虑其他事情,但这个简单的模型应该让你开始。
答案 1 :(得分:1)
颜色只是加在一起:
ambient + diffuse + emissive + specular
Ambient是基色。漫反射是材质的颜色乘以光照强度。只是增加了自发光以创造一些全局照明的幻觉。最后一个是镜面反射颜色,它被镜面光照计算的结果多了一遍。
所以它变成了:
ambientcolor + diffusecolor * diffuselighting + emissivecolor + specularcolor * specularlighting
根据我的经验,这并不总是你想要的照明模型。为这些颜色指定不同的色调会导致不自然的光照行为,但这就是OpenGl和DirectX的固定功能管道模型的工作方式。