快捷搜索:  汽车  科技

shader基础教程40讲(Shader知识之Phong模型)

shader基础教程40讲(Shader知识之Phong模型)我们用babylonjs编辑器里的事例代码来再度分析一下Phong光照模型3:specular lighting:镜面光,光滑物体表面被光源照射产生的高光现象分析上述情景,我们可以把Phong拆分成三个光照小模型的叠加形式:1:ambient lighting:环境光,可以用来模拟像月光等弱光对物体的影响,特点是物体各个面显示的颜色都是一样的。2:diffuse lighting:漫反射光,被直射光照射后反射出来的光,其特征是根据面的法线和光线方向的关系,每个面显示的颜色会有所不同。

概述

Phong光照模型是真实图形学中提出的第一个有影响的光照明模型,该模型只考虑物体对直接光照的反射作用,认为环境光是常量,没有考虑物体之间相互的反射光,物体间的反射光只用环境光表示。Phong光照模型属于针对局部光照的简单光照模型。

场景设想

我们来设想以下场景,在黑暗的场景我们用手电照射物体,当物体距离光源越近时,该物体越能呈现自身的颜色,反之则会越暗,如果物体表面光滑则还会出现高光,由于光线在环境中会发生反射的现象,物体的背光面一般也不会出现一片漆黑完全看不到的现象。

分析上述情景,我们可以把Phong拆分成三个光照小模型的叠加形式:

1:ambient lighting:环境光,可以用来模拟像月光等弱光对物体的影响,特点是物体各个面显示的颜色都是一样的。

2:diffuse lighting:漫反射光,被直射光照射后反射出来的光,其特征是根据面的法线和光线方向的关系,每个面显示的颜色会有所不同。

3:specular lighting:镜面光,光滑物体表面被光源照射产生的高光现象

shader基础教程40讲(Shader知识之Phong模型)(1)

我们用babylonjs编辑器里的事例代码来再度分析一下Phong光照模型

precision highp float;

// Varying

varying vec3 vPosition;

varying vec3 vNormal;

varying vec2 vUV;

// Uniforms

uniform mat4 world;

// Refs

uniform vec3 cameraPosition;

uniform sampler2D textureSampler;

void main(void) {

vec3 vLightPosition = vec3(0 20 10);

// World values

vec3 vPositionW = vec3(world * vec4(vPosition 1.0));

vec3 vNormalW = normalize(vec3(world * vec4(vNormal 0.0)));

vec3 viewDirectionW = normalize(cameraPosition - vPositionW);

// Light

vec3 lightVectorW = normalize(vLightPosition - vPositionW);

vec3 color = texture2D(textureSampler vUV).rgb;

// diffuse

float ndl = max(0. dot(vNormalW lightVectorW));

// Specular

vec3 angleW = normalize(viewDirectionW lightVectorW);

float specComp = max(0. dot(vNormalW angleW));

specComp = pow(specComp max(1. 64.)) * 2.;

gl_FragColor = vec4(color * ndl vec3(specComp) 1.);

}

物体表面最终呈现颜色由环境光(color)、物体自身材质颜色与直射光光源和物体相对位置形成的漫反射光( diffuse)和高光(Specular)反射叠加所决定的。

我们依次注释掉相关光照变量来观察一下对物体表面光照的影响:

1.取消环境光 gl_FragColor = vec4(color * ndl vec3(specComp) 1.);

=>> gl_FragColor = vec4( vec3(specComp) 1.);

shader基础教程40讲(Shader知识之Phong模型)(2)

2.取消漫反射光

gl_FragColor = vec4(color * ndl vec3(specComp) 1.);

=>> gl_FragColor = vec4( color vec3(specComp) 1.);

shader基础教程40讲(Shader知识之Phong模型)(3)

3.取消高光

gl_FragColor = vec4(color * ndl vec3(specComp) 1.);

=>> gl_FragColor = vec4( color * ndl 1.);

shader基础教程40讲(Shader知识之Phong模型)(4)

总结分析

①Phong光照模型仅仅考虑光源直射在物体表面所产生的光照效果,并且物体表面通常被假定为不透明,物体表面的光亮度被看成是一个定值,没有明暗的过渡,这就导致了真实感不是很强。

②Phong光照模型照射物体表面呈现的颜色由其反射光决定。而反射光由两部分组成,一是环境反射,二是漫反射和镜面反射。环境反射假定入射光均匀地从周边环境入射至物体的表面并等量地向各个方向反射出去,而漫反射分量和镜面反射分量则表示特定光源照射在物体表面上产生的反射光。

猜您喜欢: