繁体   English   中英

HLSL中的括号会导致光衰减功能无法正常工作?

Parentheses in HLSL cause light attenuation function to not work correctly?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我的像素着色器中有一个diffuse + specular方程,除了这个问题外,它工作得很好:

当我改变它时:浮点衰减= 1.0f / d * d;

为此:浮点衰减= 1.0f /(d * d);

我的模型不再点亮,而是环境强度的颜色。 我觉得这很奇怪。 我想要括号的原因是可以使用其他衰减函数,例如(1 + 0.045 * d + 0.0075 * d * d)。

这是我的整个像素着色器:

void ps( in v2p input, out float4 final_color : SV_TARGET )
{
    float3 ambient_intensity = float3( 0.3f, 0.3f, 0.3f );
    float3 diffuse_color = float3( 0.8f, 0.8f, 0.8f);
    float3 specular_color = float3( 1.0f, 1.0f , 1.0f );

    float3 tmp_light;
    tmp_light.x = light_vector.x;
    tmp_light.y = light_vector.y;
    tmp_light.z = light_vector.z;

    float3 norm_light = normalize( tmp_light );

    float3 tmp_pos;
    tmp_pos.x = input.pos.x;
    tmp_pos.y =  input.pos.y;
    tmp_pos.z = input.pos.z;

    float3 tmp_norm;
    tmp_norm.x = input.norm.x;
    tmp_norm.y = input.norm.y;
    tmp_norm.z = input.norm.z;

    float3 tmp_cam = float3( 0.0f, 0.0f, -20.0f ); // todo: make this stuff work right in cbuffer

    // light intensity
    float d = distance( tmp_light, tmp_pos );

    float attenuation = 1.0f / d*d;
    float3 pointlight = attenuation*light_color;

    // diffuse lighting 
    float diffuse = max( dot( tmp_norm, norm_light) , 0.0f );
    float3 diffuse_final = diffuse_color*ambient_intensity + diffuse_color*pointlight*diffuse;

    // specular lighting
    float3 reflect_vect = 2*dot( tmp_norm, norm_light )*tmp_norm - norm_light;
    float ref_max = max( dot( reflect_vect, normalize(tmp_cam) ), 0.0f );
    float spec_exponent = pow ( ref_max, 1.0f );

    float3 spec_final;
    if( dot( tmp_norm, norm_light ) <= 0 )
    {
        spec_final = float3( 0.0f, 0.0f, 0.0f );
    }
    if( dot( tmp_norm, norm_light ) > 0 )
    {
        spec_final = specular_color*pointlight*spec_exponent;
    }

    final_color = float4(  diffuse_final + spec_final, 1.0f );
}

不带括号: http : //i48.tinypic.com/357rmnq.png

带括号: http : //i45.tinypic.com/70jscy.png

1 个回复

线路float attenuation = 1.0f / d*d; 等于float attenuation = 1.0f; 这就是为什么您获得没有衰减的阴影对象的原因。

假设您的物体放置在原点附近,并且与物体到相机的距离相比较小,那么使用float attenuation = 1.0f / (d*d);时,衰减将接近零float attenuation = 1.0f / (d*d); 这是因为d约为20.0attenuation1.0 / 400.0 = 0.0025 因此,模型上唯一的可见光是环境光。 实际上,这是正确的-点光源仅具有非常高的衰减,因此几乎没有对物体产生影响。 尝试其他衰减函数,例如1.0f / (0.003*d*d) ,您将看到差异。

1 Raytracer中的光衰减

我正在编写光线跟踪器,但是在应该如何随着距光源的距离而掉落光线方面遇到一些麻烦。 距离的值似乎太高了,所以当我将它们平方并除以它们的强度时,最终得到的只是一个黑屏。 我如何更改像素上光源的强度而又不影响场景。 现在我的代码是 ...

2 光衰减的奇怪行为

我试图实现一个简单的查看器,并且试图实现点光源的光衰减。 我的问题如下: 我的那条自然线越过球面。 着色器中的相关代码为: 作为稍微高级一点的照明的新手,我真的看不到有什么问题。 (我知道也许应该是一个不同的问题,但是太小了,我想知道是否我也可以在这里问这个问题 ...

3 GLSL带阴影的光衰减

我正在研究ThreeJS项目,并且正在编写自定义着色器材料。 过去,当我使用Amplify Shader Editor在Unity中工作时,“光衰减”节点也包含阴影。 我试图在GLSL中复制它,但我不知道如何。 对于光衰减,我具有以下功能,该功能似乎可以正常工作,但其中不包括阴影。 ...

4 HLSL“基于图像的灯”

我在HLSL中有一个代码旨在模拟IBL(基于图像的灯光http://en.wikipedia.org/wiki/Image-based_lighting )。 为了模拟IBL,必须使物体周围的“世界”具有纹理,我想根据物体的位置动态生成纹理。 我有2个问题: •如何在物体周围360度生 ...

5 衰减未正确应用

我不明白光衰减是否正确应用。 似乎不是因为位于(-500, 100, 100) (左侧)的立方体钢架的光泽度太高了-考虑到浅色位置(白色立方体) (100.0, 100.0f, 100.0f) 。 我正在使用这个公式来获得衰减 片段着色器: 并将以下值传递给程序 ...

6 点光源/聚光灯在glsl 1.3+中的衰减?

我一直在研究OpenGL的Superbible(第5版)点光源示例。 我发现它们缺少集成到旧光照模型中的恒定,线性和二次衰减值,因此我根据该食人魔指南编写了一个具有衰减值的点光源着色器。 结果是完全奇怪的。 如何在新的glsl上获得显着的光衰减? 是否有用于衰减常数的glsl表? ...

2011-04-03 01:46:34 2 5301   glsl
7 GLSL照明 - 基于光半径的衰减

所以我一直致力于照明,为了阴影贴图的目的,我做了基于半径而不是三个衰减因子(恒定,线性和二次)的光衰减,并且......好吧......边缘附近看起来不太好看。 http://i.stack.imgur.com/H680a.png 它切断得非常快,着色器代码看起来像这样...... ...

8 三个js光衰/衰减计算

我有一个聚光灯瞄准距离为 10 的物体。光的强度为 4,衰减为 1,最大距离为 20。假设物体上的光强度(衰减/衰减后)为 x . x 是如何计算的? x 是否为 2,如下所示。 ((4 / 20) / 1) * 10 使其变为 2。 这个公式对吗。 ((强度/距离)/衰减)*问题中的 ...

9 如何获得其他位置的光衰减?

我想获取其他位置的光衰减。 我的蓝图: 这是因为我想将从A面获得的光L的光衰减应用于B面。 我该怎么办? 我可以获得阴影衰减以及光衰减吗? 我还在Unity文档中查找了顶点着色器,并寻找了表面着色器,但是找不到答案。 ...

2018-11-09 08:11:43 0 37   unity3d
10 HLSL流输出条目无法正常工作

我想将基于流输出结构的粒子系统实现到我的更大项目中。 我见过很少有关该方法的文章,并且构建了一个粒子。 它几乎可以正常工作,但是在带有流的几何着色器中,我始终无法获得InitVel.z和age的值,因为它始终为0。如果我更改年龄的顺序(例如age在Position之前),则可以正常使用age ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM