大家好,欢迎来到IT知识分享网。
衰减
实现
//实现了一种线性衰减因子的计算方法,可将其应用于点光源于聚光灯 float CalcAttenuation(float d, float falloffStart, float falloffEnd) {
// Linear falloff. return saturate((falloffEnd-d) / (falloffEnd - falloffStart)); } //代替菲涅尔方程的石里克近似。此函数基于光向量L于表面法线n之间的夹角,并根据菲涅尔效应近似地计算出以n为法线的表面所反射光的百分比 // Schlick gives an approximation to Fresnel reflectance (see pg. 233 "Real-Time Rendering 3rd Ed."). // R0 = ( (n-1)/(n+1) )^2, where n is the index of refraction. float3 SchlickFresnel(float3 R0, float3 normal, float3 lightVec) {
float cosIncidentAngle = saturate(dot(normal, lightVec)); float f0 = 1.0f - cosIncidentAngle; float3 reflectPercent = R0 + (1.0f - R0)*(f0*f0*f0*f0*f0); return reflectPercent; } //计算反射到观察者眼中的光量,该值为漫反射光量于镜面反射光量的总和 float3 BlinnPhong(float3 lightStrength, float3 lightVec, float3 normal, float3 toEye, Material mat) {
//m由光泽度推导而来,而光泽度则根据粗糙度求得 const float m = mat.Shininess * 256.0f; float3 halfVec = normalize(toEye + lightVec); float roughnessFactor = (m + 8.0f)*pow(max(dot(halfVec, normal), 0.0f), m) / 8.0f; float3 fresnelFactor = SchlickFresnel(mat.FresnelR0, halfVec, lightVec); float3 specAlbedo = fresnelFactor*roughnessFactor; //尽管我们进行的是LDR(low dynamic range .低动态范围)渲染,但spec(镜面反射)公式得到 // 的结果仍会超出范围[0,1],因此现将其按比例缩小一些 // Our spec formula goes outside [0,1] range, but we are // doing LDR rendering. So scale it down a bit. specAlbedo = specAlbedo / (specAlbedo + 1.0f); return (mat.DiffuseAlbedo.rgb + specAlbedo) * lightStrength; } //点光 float3 ComputePointLight(Light L, Material mat, float3 pos, float3 normal, float3 toEye) {
//自表面指向光源的向量 float3 lightVec = L.Position - pos; //由表面到光源的距离 float d = length(lightVec); //范围检测 if(d > L.FalloffEnd) return 0.0f; //对光向量进行规范化处理 lightVec /= d; //通过朗伯余弦定律按比例降低光强 // Scale light down by Lambert's cosine law. float ndotl = max(dot(lightVec, normal), 0.0f); float3 lightStrength = L.Strength * ndotl; //根据距离计算光的衰减 float att = CalcAttenuation(d, L.FalloffStart, L.FalloffEnd); lightStrength *= att; return BlinnPhong(lightStrength, lightVec, normal, toEye, mat); }
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/135419.html