3d 用于软件渲染的三维彩色材质平面着色算法

3d 用于软件渲染的三维彩色材质平面着色算法,3d,pipeline,3d-engine,3d,Pipeline,3d Engine,我目前正在寻找有关如何在照亮的3d场景中获得给定人脸的最终平面颜色值的信息。我有一个材质类,它包含以下4种颜色: 环境光、镜面反射、漫反射和发射 我的颜色类有一些简单混合效果的方法,比如加法、乘法等 从灯光列表、摄影机位置、材质、面法线和面位置。我想使用标准四色材质模型,使用软件渲染管道计算要填充的面的最终颜色。这些颜色只是叠加在一起: ambient + diffuse + emissive + specular 环境光是基本色。漫反射是材质的颜色与照明强度的乘积。添加Emissive只是为

我目前正在寻找有关如何在照亮的3d场景中获得给定人脸的最终平面颜色值的信息。我有一个材质类,它包含以下4种颜色:

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

我的颜色类有一些简单混合效果的方法,比如加法、乘法等


从灯光列表、摄影机位置、材质、面法线和面位置。我想使用标准四色材质模型,使用软件渲染管道计算要填充的面的最终颜色。

这些颜色只是叠加在一起:

ambient + diffuse + emissive + specular
环境光是基本色。漫反射是材质的颜色与照明强度的乘积。添加Emissive只是为了创建一些全局照明的幻觉。最后一个是镜面反射颜色,它由镜面反射照明计算结果叠加

因此,它变成:

ambientcolor + diffusecolor * diffuselighting + emissivecolor + specularcolor * specularlighting

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

这些颜色只是添加在一起:

ambient + diffuse + emissive + specular
环境光是基本色。漫反射是材质的颜色与照明强度的乘积。添加Emissive只是为了创建一些全局照明的幻觉。最后一个是镜面反射颜色,它由镜面反射照明计算结果叠加

因此,它变成:

ambientcolor + diffusecolor * diffuselighting + emissivecolor + specularcolor * specularlighting

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

我假设您想要固定功能GL也使用的标准或照明模型

发射术语是材质自身发射的颜色(例如,在建模灯光时)。所以它只是增加了最终的颜色

color = emissive;
color += ambient * lightColor;
由于无限反射光,环境项模拟间接照明计算,因此它不依赖于灯光的位置,并且几乎无处不在。因此,材质的环境光只需乘以灯光的颜色即可添加到最终颜色

color = emissive;
color += ambient * lightColor;
漫反射项模拟标准朗伯反射镜,该反射镜在所有方向上均匀反射光。它取决于灯光方向与曲面法线之间的角度,角度越小,灯光越多

lightDir = normalize(lightPos-facePos);
color += dot(lightDir, normal) * diffuse * lightColor;
镜面反射项最终模拟镜面反射曲面,该曲面将更多光线反射到单一方向(完美反射方向)。因此,这取决于你看脸的方向。此外,反射率取决于描述表面粗糙度的另一个参数(或其实际光泽度,也是GL使用的名称,值越高,高光越尖锐,因此越“有光泽”)

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


除了简单的点光源以外的更复杂的光,没有距离衰减,你必须考虑其他事情,但是这个简单的模型应该让你开始。

< P>我假定你想要的是标准函数或光照模型,固定函数GL也使用它。

发射术语是材质自身发射的颜色(例如,在建模灯光时)。所以它只是增加了最终的颜色

color = emissive;
color += ambient * lightColor;
由于无限反射光,环境项模拟间接照明计算,因此它不依赖于灯光的位置,并且几乎无处不在。因此,材质的环境光只需乘以灯光的颜色即可添加到最终颜色

color = emissive;
color += ambient * lightColor;
漫反射项模拟标准朗伯反射镜,该反射镜在所有方向上均匀反射光。它取决于灯光方向与曲面法线之间的角度,角度越小,灯光越多

lightDir = normalize(lightPos-facePos);
color += dot(lightDir, normal) * diffuse * lightColor;
镜面反射项最终模拟镜面反射曲面,该曲面将更多光线反射到单一方向(完美反射方向)。因此,这取决于你看脸的方向。此外,反射率取决于描述表面粗糙度的另一个参数(或其实际光泽度,也是GL使用的名称,值越高,高光越尖锐,因此越“有光泽”)

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


对于更复杂的灯,除了简单的点光源,没有距离衰减,你必须考虑其他的事情,但是这个简单的模型应该让你开始。如果必须在某种“组件”情况下应用颜色,它会是这样的:Color.red+=pow(dot(normal,halfVec),shiness.red)*specular.red*lightColor.red;color.blue+=pow(点(正常,半矢量),反光度.blue)*镜面反射.blue*浅色.blue;color.green+=pow(点(正常,半矢量),反光度.green)*镜面反射.green*浅色.green@Gary基本上是的,但光泽度只是一个标量值,只有颜色有3/4分量;对于您描述的pow函数,第一个参数是“功率”参数,第二个参数是“基”?@Gary否,点积(准方向之间的角度/cos)是基,光泽度是指数。因此,当光泽度更大时,该值(高光)会更快地下降到完美角度(0)的两侧,从而产生更清晰的高光。@AzadSalahli嗯,标准的3D向量规范化,它还意味着什么?谢谢。如果必须在某种“组件”情况下应用颜色,它会是这样的:Color.red+=pow(dot(normal,halfVec),shiness.red)*specular.red*lightColor.red;color.blue+=pow(点(正常,半矢量),反光度.blue)*镜面反射.blue*浅色.blue;颜色.绿色+=功率(点(标准