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;
}
效果图
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;
}
相关文章推荐
- opengl光照 Blinn-Phone模型与实现
- OpenGL光照的计算模型
- OpenGL中ADS光照模型没有镜面光照效果
- 现代OpenGL+Qt学习笔记之十一:使用halfway向量提高光照计算效率
- OpenGL光照的计算模型
- opengl光照模型
- 利用镜面反射让游戏闪耀起来 - 使用贴图对模型的高光进行遮罩
- OpenGL学习: 光照系列2-材质和lighting maps使用
- 在OPENGL中使用光照
- 使用Gensim建立bow TFIDF LSI模型对文本相似度计算
- OpenGL 4.0 GLSL 用单光源 实现逐顶点 漫反射光照模型
- 探究OpenGL光照模型的着色器实现
- Opengl 4种光照模型
- 简单光照模型(Phong模型(镜面反射)与 Blinn-Phong光照模型(修正镜面光) )
- OpenGL高级特性之利用Image内存模型&计算着色器&原子操作实现(直方图模型)通用计算
- Opengl_20 _复习变换矩阵+复习光源+两个模型使用不同的shader
- Android OpenGL ES 开发教程(25):OpenGL光照模型
- OpenGL中的光照[光照计算]
- 自己封装的三维AABB包围盒类,用于三维模型静态碰撞检测,可以直接调用,使用OpenGL进行绘制
- OpenGL教程翻译 第二十二课 使用Assimp加载模型