1

我目前正在寻找有关如何在明亮的 3d 场景中获取给定面部的最终平面颜色值的信息。我有一个包含以下 4 种颜色的 Material 类:

环境、镜面反射、漫反射和自发光

我的 Color 类具有简单混合效果的方法,例如加法、乘法等

来自灯光列表、相机位置、材质、面部法线和面部位置。我想使用标准 4 色材料模型使用软件渲染管道计算要填充的面部的最终颜色。

4

2 回答 2

3

我假设您想要标准PhongBlinn-Phong照明模型,固定功能 GL 也使用该模型。

发射项是材料自身发出的颜色(例如在对灯光建模时)。所以它只是增加了最终的颜色。

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;

当然,必须为每个光计算环境、漫反射和镜面反射项。

对于没有距离衰减的简单点光源以外的更复杂的灯光,您必须考虑其他事情,但是这个简单的模型应该可以帮助您入门。

于 2011-08-14T15:25:44.593 回答
1

颜色只是加在一起:

ambient + diffuse + emissive + specular

环境是基色。漫反射是材质的颜色乘以光照强度。Emissive 只是添加来创建一些全局照明的错觉。最后一个是镜面反射颜色,它与镜面反射光照计算的结果相乘。

所以它变成:

ambientcolor + diffusecolor * diffuselighting + emissivecolor + specularcolor * specularlighting

根据我的经验,这并不总是您想要的光照模型。为这些颜色指定不同的色调会导致不自然的光照行为,但这就是 OpenGl 和 DirectX 的固定功能管道模型的工作方式。

于 2011-08-14T15:16:41.160 回答