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();
}
查看全文
相关阅读:
如何判断单链表是否存在环
语法面试等题目汇总
数据分析师常见的10道面试题解答
Python 的函数
Python 的错误和异常处理
Python 的条件语句和循环语句
Python 的基本运算和内置函数
Python 的数据表示
Python 基础
关于 Python
原文地址:https://www.cnblogs.com/Pointer/p/29444.html
最新文章
git clone 遇到的坑
VS Code 快捷键使用小技巧
visual studio code前端插件及常用快捷键【转】
vue文件在编辑器Sublime Text3中高亮
Python字符串格式化
Python字符串方法
Pycharm 快捷键
Sybase常用函数
Sybase datetime 时间转换格式 convert(varchar(10),字段名,转换格式)
Windows server 2008系统下FTP服务器的安装
热门文章
普通用户登录PLSQL后提示空白OK对话框错误
组策略对应于注册表位置汇总
Error when launching Quest Central for DB2: "QCC10000E
跳表SkipList
在Ubuntu 14.04 64bit上安装numpy和matplotlib库
秒杀多线程第一篇 多线程笔试面试题汇总
Hive
linux sort 命令详解
马尔可夫链
指针以及内存分配
Copyright © 2011-2022 走看看