您的位置:首页 > 运维架构

opengl使用Blin-phone模型计算镜面光照强度

2017-08-10 11:18 483 查看
由于计算镜面光光照强度,计算反射光非常耗时,可以使用Blin-phone模型来简化计算

效果图



blin-phone模型计算镜面反射光 片元shader

uniform vec4 U_LightPos; //光源位置
uniform vec3 U_EyePos; //眼睛的位置
uniform vec4 U_AmbientLightColor;//环境光颜色
uniform vec4 U_AmbientMaterial;//环境光材质
uniform vec4 U_DiffuseLightColor;//漫反射光颜色
uniform vec4 U_DiffuseMaterial;//漫反射光材质
uniform vec4 U_SpecularLightColor;//镜面光颜色
uniform vec4 U_SpecularMaterial;//镜面光材质

varying vec3 V_Normal;//转换到世界坐标空间的法向量
varying vec3 V_WorldPos;//模型的世界坐标顶点

void main()
{
//---计算环境光
vec4 ambientColor=U_AmbientLightColor*U_AmbientMaterial;

//---计算漫反射光
//入射光向量
vec3 L=vec3(0.0);
if(U_LightPos.w==0.0)//如果是方向光
{
L=U_LightPos.xyz;
}

L=normalize(L);
vec3 n=normalize(V_Normal);

//计算漫反射光照强度
float diffuseIntensity=max(0.0,dot(L,n));
//计算漫反射光
vec4 diffuseColor=U_DiffuseLightColor*U_DiffuseMaterial*diffuseIntensity;

//---计算镜面光
//从眼睛到模型上每一点的视线向量
vec3 viewDir=U_EyePos-V_WorldPos;
viewDir=normalize(viewDir);

//根据Blin-Phone模型计算镜面光
//计算反射光
vec3 halfVector=L+viewDir;
halfVector=normalize(halfVector);

//计算镜面光强度
float specularIntensity=0.0;
//根据漫反射光做过滤,减少计算量
if(diffuseIntensity==0.0)
{
specularIntensity=0.0;
}
else
{
specularIntensity=pow(max(0.0,dot(n,halfVector)),128.0);
}

//最终镜面光的值
vec4 specularColor=U_SpecularLightColor*U_SpecularMaterial*specularIntensity;
//最终渲染像素值
gl_FragColor=ambientColor+diffuseColor+specularColor;
}

顶点shader
attribute vec3 pos;
attribute vec2 texcoord;
attribute vec3 normal;

uniform mat4 M;
uniform mat4 P;
uniform mat4 V;
uniform mat4 NM;

varying vec3 V_Normal;
varying vec3 V_WorldPos;

void main()
{
V_Normal=mat3(NM)*normal;
vec4 worldPos=M*vec4(pos,1.0);
V_WorldPos=worldPos.xyz;

gl_Position=P*V*worldPos;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: