我的工作是由Brian Karis撰写的Epic关于PBR的论文。我尝试查看其他来源,看是否能找到任何东西,但没有任何结果可以解决我遇到的问题。
float3 TubeLight(float3 worldPos, float3 lightVec, float3 normal, float3 toCamera, float roughness, float3 specColor, out float ndl)
{
float3 pos = (cLightPosPS.xyz - worldPos);
float3 reflectVec = reflect(-toCamera, normal);
float3 L01 = lightVec * LightLengh;
float3 L0 = pos - 0.5 * L01;
float3 L1 = pos + 0.5 * L01;
float3 ld = L1 - L0;
float distL0 = length( L0 );
float distL1 = length( L1 );
float NoL0 = dot( L0, normal ) / ( 2.0 * distL0 );
float NoL1 = dot( L1, normal ) / ( 2.0 * distL1 );
ndl = ( 2.0 * clamp( NoL0 + NoL1, 0.0, 1.0 ) )
/ ( distL0 * distL1 + dot( L0, L1 ) + 2.0 );
float RoL0 = dot( reflectVec, L0 );
float RoLd = dot( reflectVec, ld );
float L0oLd = dot( L0, ld );
float distLd = length( ld );
float t = ( RoL0 * RoLd - L0oLd )
/ ( distLd * distLd - RoLd * RoLd );
float3 closestPoint = L0 + ld * saturate( t);
float3 centreToRay = dot( closestPoint, reflectVec ) * reflectVec - closestPoint;
closestPoint = closestPoint + centreToRay * saturate(LightRad / length(centreToRay));
float3 l = normalize(closestPoint);
float3 h = normalize(toCamera + l);
ndl = saturate(dot(normal, l));
float hdn = saturate(dot(h, normal));
float hdv = dot(h, toCamera);
float ndv = saturate(dot(normal, toCamera));
float distL = length(closestPoint);
float alpha = roughness * roughness;
float alphaPrime = saturate(LightRad / (distL * 2.0) + alpha);
const float3 fresnelTerm = Fresnel(specColor, hdv) ;
const float distTerm = Distribution(hdn, alphaPrime);
const float visTerm = Visibility(ndl, ndv, roughness);
return distTerm * visTerm * fresnelTerm ;
}
如果代码片段不足以帮助解决此问题,则可以从GitHub下载全区域照明分支。可以在Urho3D网站上找到构建说明(由于声誉而无法链接),请注意,当前区域照明仅在DX11中进行了测试。着色器源文件可在
[build location]/bin/CoreData/Shaders/HLSL
下找到。
如果pos乘以40行,则它会产生更多的电子管效果,但仍然与正确的结果相去甚远。
#1 楼
找到解决方案后,事实证明lightVec不是来自灯管的光矢量,而是灯管指向的方向。因此,我需要向其传递一个轻度旋转值以在此处使用。结果:
评论
$ \ begingroup $
效果不错!
$ \ endgroup $
–艾伦·沃尔夫(Alan Wolfe)
16-09-20在16:37
评论
我们能看一下它的外观吗?您说过,管灯看起来还是一样,但如果您不希望发布两个图像都可以,那么就可以了。无法发布图片,因为我需要10次重复才能做更多然后2个链接
烦死了有人请进一步支持这个问题:p
可以尝试一下http://imgur.com/a/IxhTd
我添加了链接。无论值多少,顶部还是底部图像都应该是灯管?