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();
}
查看全文
相关阅读:
log4cxx在vs2013的静态编译
windows下sqlite3静态库和动态库的编译
iconv gbk字符转utf8字符
wchar_t与char、wstring与string的相互转换
获取当前时间并格式化
快速获取文件大小
cryptopp开源库的使用(二):base64加密
cryptopp开源库的使用(零):windows下使用visual studio编译
cryptopp开源库的使用(一):md5加密
Docker 安装Oracle
原文地址:https://www.cnblogs.com/Pointer/p/29444.html
最新文章
报表测试用例设计方法总结
ADB简易安装方法
一张图玩转H5测试
部署vuejs dist文件,通过node.js编译
Win7 maven安装及配置
Win7系统安装 MySQL 5.7.23
SonarQube 平台搭建
Win7系统安装 MySQL 8.0.11
svn 更新文件冲突,提示中文乱码解决
App压力测试整理
热门文章
tensorflow代码组织格式(转)
双线性插值
Pytorch(一)
Deeplearning——动态图 vs. 静态图
DL for objection detection
PyNest——part 4: topologically structured networks
PyNest——part 3: connecting networks with synapses
PyNest——part 2: populations of neurons
PyNest——Part1:neurons and simple neural networks
wxsqlite3的加密模块单独编译
Copyright © 2011-2022 走看看