首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有光量的延迟渲染器产生奇怪的条带。

带有光量的延迟渲染器产生奇怪的条带。
EN

Stack Overflow用户
提问于 2015-04-04 16:32:16
回答 1查看 1K关注 0票数 4

我有一个延迟渲染器,它只计算当当前片段在光源范围内时的照明方程。我通过计算应用程序中光量的大小来做到这一点,并将其与其他光信息一起发送到着色器。然后,我检查片段与lightPos之间的距离(每个光),并使用光的体积作为控制。

为了简单起见,我使用了一个线性方程(二次方程产生的光体积太大)来进行光衰减。所有的照明方程都很好,但当我使用多盏灯时,我有时会看到奇怪的圆形边框,就好像距离检查会导致光线计算过早停止,导致照明发生突然变化。您可以在下面的图像中看到这种效果:

片段着色器代码如下:

代码语言:javascript
复制
vec3 position = texture(worldPos, fs_in.TexCoords).rgb;        
vec3 normal = texture(normals, fs_in.TexCoords).rgb;
normal = normalize(normal * 2.0 - 1.0);
vec3 color = texture(albedo, fs_in.TexCoords).rgb;
float depth = texture(worldPos, fs_in.TexCoords).a;
// Add global ambient value
fragColor = vec4(vec3(0.1) * color, 0.0);
for(int i = 0; i < NR_LIGHTS; ++i)
{
    float distance = abs(length(position - lights[i].Position.xyz));
    if(distance <= lights[i].Size)
    {
        vec3 lighting;                
        // Ambient            
        lighting += lights[i].Ambient * color;            
        // Diffuse
        vec3 lightDir = normalize(lights[i].Position.xyz - position);
        float diffuse = max(dot(normal, lightDir), 0.0);
        lighting += diffuse * lights[i].Diffuse * color;
        // Specular
        vec3 viewDir = normalize(viewPos - position);
        vec3 reflectDir = reflect(-lightDir, normal);
        float spec = pow(max(dot(viewDir, reflectDir), 0.0), 8);
        lighting += spec * lights[i].Specular;

        // Calculate attenuation
        float attenuation = max(1.0f - lights[i].Linear * distance, 0.0);
        lighting *= attenuation;
        fragColor += vec4(lighting, 0.0);
    }
}
fragColor.a = 1.0;    

衰减函数是碎片位置与每个光源之间距离的线性函数。

在这个特定场景中,我使用0.075的线性衰减值,其中我生成光的大小/半径如下:

代码语言:javascript
复制
Size = 1.0 / Linear;

几个观察

当我移除距离检查if(distance <= lights[i].Size)时,我不会遇到奇怪的边界问题。

如果我将单个光源的照明值可视化,并将距离可视化为distance/lights.Size,我将得到以下2幅图像:

这看起来好像光半径/距离计算和光衰减在半径上是相似的。

当我将距离检查方程改为if(distance <= lights[i].Size * 2.0f) (大幅度增加光线半径)时,我得到的边框显着减少,但是如果我看得足够近,我会不时地看到它们,所以即使这样也不能完全消除问题。

我不知道是什么导致了这一切,我现在别无选择。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-08 20:47:23

本节:

代码语言:javascript
复制
    vec3 lighting;                
    // Ambient            
    lighting += lights[i].Ambient * color;   

在添加之前,您永远不会初始化照明。我认为这会导致不明确的行为。尝试将其更改为:

代码语言:javascript
复制
    // Ambient            
    vec3 lighting = lights[i].Ambient * color;   
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29448808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档