zoukankan
html css js c++ java
GLSL学习笔记 6.2 Vertex Shader
一个简单的逐顶点光照模型。光照效果由散射光和镜面反射光构成。
程序流程
转化顶点与法线到当前的眼坐标系中
vec3 ecPosition
=
vec3 (gl_ModelViewMatrix
*
gl_Vertex);
vec3 tnorm
=
normalize(gl_NormalMatrix
*
gl_Normal);
得到 顶点->光源向量 与 顶点
->
观察点向量
vec3 lightVec
=
normalize(LightPosition
-
ecPosition);
vec3 viewVec
=
normalize(
-
ecPosition);
根据 入射光线向量 计算反射光线向量
vec3 reflectVec
=
reflect(
-
lightVec, tnorm);
假设漫反射光线强度随入射光线与法线夹角呈余弦分布,
则漫反射光照强度可以近似为
float
diffuse
=
max(dot(lightVec, tnorm),
0.0
);
假设镜面反射光线强度随反射光线与观察方向夹角呈余弦分布,
则镜面反射光照强度可以近似为
spec
=
max(dot(reflectVec, viewVec),
0.0
);
随后增强镜面反射聚集度
spec
=
pow(spec,
16.0
);
最后通过混合散射光与镜面光强度获得该顶点光线强度
LightIntensity
=
DiffuseContribution
*
diffuse
+
SpecularContribution
*
spec;
程序清单
uniform vec3 LightPosition;
const
float
SpecularContribution
=
0.3
;
const
float
DiffuseContribution
=
1.0
-
SpecularContribution;
varying
float
LightIntensity;
varying vec2 MCposition;
void
main(
void
)
{
vec3 ecPosition
=
vec3 (gl_ModelViewMatrix
*
gl_Vertex);
vec3 tnorm
=
normalize(gl_NormalMatrix
*
gl_Normal);
vec3 lightVec
=
normalize(LightPosition
-
ecPosition);
vec3 reflectVec
=
reflect(
-
lightVec, tnorm);
vec3 viewVec
=
normalize(
-
ecPosition);
float
diffuse
=
max(dot(lightVec, tnorm),
0.0
);
float
spec
=
0.0
;
if
(diffuse
>
0.0
)
{
spec
=
max(dot(reflectVec, viewVec),
0.0
);
spec
=
pow(spec,
16.0
);
}
LightIntensity
=
DiffuseContribution
*
diffuse
+
SpecularContribution
*
spec;
MCposition
=
gl_Vertex.xy;
gl_Position
=
ftransform();
}
查看全文
相关阅读:
一步步学习SPD2010--第十章节--SP网站品牌化(4)--创建并关联CSS文件
一步步学习SPD2010--第十章节--SP网站品牌化(3)--在内容页中识别样式
一步步学习SPD2010--第十章节--SP网站品牌化(2)--在CSS中识别样式
一步步学习SPD2010--第十章节--SP网站品牌化(1)--设置CSS和颜色编码页面编辑器选项
一步步学习SPD2010--第十章节--SP网站品牌化
一步步学习SPD2010--第九章节--使用可重用工作流和工作流表单(14)--关键点
一步步学习SPD2010--第九章节--使用可重用工作流和工作流表单(13)--修改任务表单
一步步学习SPD2010--第九章节--使用可重用工作流和工作流表单(12)--给初始表单添加关联字段
一步步学习SPD2010--第九章节--使用可重用工作流和工作流表单(11)--修改关联表单
matplotlib库疑难问题---1、解决中文乱码问题
原文地址:https://www.cnblogs.com/Pointer/p/29444.html
最新文章
sqlserver 2000数据压缩解决方法
c# 链接mongDB集群实战开发3
linux下c程序 daemon、fork与创建pthread的顺序问题
IOS解析XML文件
ASP.NET 应用程序遭遇Server Application Unavailable问题的解决的方法
Unix/Linux环境C编程新手教程(21) 各个系统HelloWorld跑起来效果怎样?
Android真机调试不打印日志解决方式
安装站点时出现“连接数据库出现数据库server或登录password无效,无法连接数据库,请又一次设定”解决方法
php文件管理,能够点击依照时间,大小,名称排序
06002_Redis概述
热门文章
雷林鹏分享:Ruby 变量
雷林鹏分享:Ruby 类案例
雷林鹏分享:Ruby 注释
雷林鹏分享:Ruby 运算符
雷林鹏分享:Ruby 循环
雷林鹏分享:Ruby 判断
雷林鹏分享:Ruby 块
雷林鹏分享:Ruby 方法
雷林鹏分享:Ruby 模块(Module)
SP2010:从Ribbon功能区移除操作
Copyright © 2011-2022 走看看