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();
}
查看全文
相关阅读:
windows 下安装MongoDB
vue.js环境在window和linux安装
python3的hashlib库sha256、pbkdf2_hmac、blake2b基本用法
Locust 接口性能测试
PyTestReport自动化报告使用说明
Google开发者F12工具面板-network详解
AppScan基础使用
pip下载速度慢解决方法
pycharm工具设置py模板
jmeter实操及性能测试基础知识整理
原文地址:https://www.cnblogs.com/Pointer/p/29444.html
最新文章
面试问题之数据结构与算法:动态规划、分治法、贪心法的应用场景
面试问题之数据结构与算法:哈希表介绍、构造方法及冲突解决方法
面试问题之C++语言:如何避免内存泄漏?
面试问题之数据结构与算法:堆排序的时间复杂度分析
面试问题之数据结构与算法:排序算法复杂度一览表
面试问题之数据结构与算法:map与unordered_map
solr admin界面的监控
solr 查询解析器
solr查询参数
REST
热门文章
solr 倒排索引(转载)
solr介绍
分布式 一致性Paxos算法(转载)
分布式事务 两阶段提交 三阶段提交(转载)
linux内核 内存管理
linux内核 同步
adb命令依赖包下载及使用常用操作
python之三方库(冷门+热门)
Yapi接口管理平台 本地部署 windows环境
git和小乌龟在windows下安装
Copyright © 2011-2022 走看看