软件渲染的3D色彩素材平面阴影算法

问题描述 投票:1回答:2

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

环境色, 镜面色, 漫射色 & 发射色。

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

从灯光、摄像机位置、材质、脸部正常&脸部位置的列表中。我想使用软件渲染流水线,使用标准的4色材质模型,计算出要填充的一个面的最终颜色。

3d pipeline 3d-engine
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;

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

除了没有距离衰减的简单点灯之外,对于更复杂的灯光,你还得考虑其他的东西,但这个简单的模型应该能让你入门。


1
投票

颜色只是加在一起。

ambient + diffuse + emissive + specular

Ambient是基色 Diffuse是材料的颜色乘以照明强度。Emissive是为了制造一些全局照明的假象而添加的。最后一个是specularcolor,它是由specular照明计算的结果乘以的。

所以就变成了。

ambientcolor + diffusecolor * diffuselighting + emissivecolor + specularcolor * specularlighting

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

© www.soinside.com 2019 - 2024. All rights reserved.