Skip to main content

朗伯余弦定律在游戏开发中的应用

Feishiko
Author
Feishiko
Programming Avali
Table of Contents

朗伯余弦定律
#

用来计算某个角度所得到的亮度的多少,因为亮度不可能小于0(范围0-1),所以最小值为0

light = max(cos(theta), 0.0);

Shadertoy
#

首先我们需要一张凹凸贴图(Bump Mapping),用来表示光照物体的各种细节/深度

代码部分:

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    // Normalized pixel coordinates (from 0 to 1)
    vec2 uv0 = fragCoord/iResolution.yy;
    
    //光照的角度
    vec2 lightDir = vec2(cos(iTime), sin(iTime));
    
    //光源高度
    float pitch = .5;
    
    //朝光的方向偏移原来的uv
    vec2 uv1 = uv0 + lightDir/iResolution.yy;

    //获取偏移后的深度
    float height0 = texture(iChannel0, uv0).r;
    float height1 = texture(iChannel0, uv1).r;
    
    //深度
    float depth = .1;
    
    //normal(法向量),根据两个不同的uv偏移的值算出两点相差的角度
    float normal = atan(1./iResolution.y, (height1 - height0)*depth);
    
    //光照强度
    float lam = max(cos(normal - pitch), 0.);

    // Time varying pixel color

    // Output to screen
    fragColor = vec4(vec3(lam), 1.0);
}

最终效果: