我最近一直在为名为Urho3D的小型开源游戏引擎开发区域灯,但是在渲染管灯时遇到了一个问题,尽管长度值已更改,但该灯看上去与球体灯相同。

我的工作是由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行,则它会产生更多的电子管效果,但仍然与正确的结果相去甚远。

评论

我们能看一下它的外观吗?您说过,管灯看起来还是一样,但如果您不希望发布两个图像都可以,那么就可以了。
无法发布图片,因为我需要10次重复才能做更多然后2个链接

烦死了有人请进一步支持这个问题:p

可以尝试一下http://imgur.com/a/IxhTd

我添加了链接。无论值多少,顶部还是底部图像都应该是灯管?

#1 楼

找到解决方案后,事实证明lightVec不是来自灯管的光矢量,而是灯管指向的方向。因此,我需要向其传递一个轻度旋转值以在此处使用。

结果:


评论


$ \ begingroup $
效果不错!
$ \ endgroup $
–艾伦·沃尔夫(Alan Wolfe)
16-09-20在16:37