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();
}
查看全文
相关阅读:
Handlerbars基础笔记
each()和eq()
可编辑表格(Editable Table)
垂直居中vertical-align
CSS属性的私有前缀
CSS进阶知识
CSS预处理器们
CSS3之伪元素选择器和伪类选择器
CSS基础复习
Plan
原文地址:https://www.cnblogs.com/Pointer/p/29444.html
最新文章
移动网站用backbone还是angular?
C语言函数指针做函数参数案例
C语言函数指针数组简单案例
C语言函数指针简单应用
C语言常用字符串操作函数
C语言打印万年历
均值背景建模
Windows 下开发PHP扩展资源
通过WEB调用大华网络摄像头
kinect fusion 3D扫描
热门文章
利用信号量实现线程同步
多线程死锁的产生和解决
利用关键代码段实现线程同步
利用关键代码段实现线程同步
SetWindowPos设置窗口的Z轴次序
SetWindowPos设置窗口的Z轴次序
JS对象和JSON字符串相互转化总结
JS对象和JSON字符串相互转化总结
JavaScript编程中的对象概念
JavaScript创建JSON对象
Copyright © 2011-2022 走看看