在数字化转型中,选择合适的跨平台开发框架不仅能提高效率,还有助于确保数据安全与合规性。
837
2022-11-20
openGL着色语言笔记
openGL着色语言笔记
前言
目前看到第六章,前五章都是简介,到了第六章才开始真正的代码阶段,首先是顶点着色器的编写。她是基于phone光照模型,即环境光、漫反射、镜面光相互作用的结果,当然这只是基础光照模型,要想获得逼真的光照模型还得使用大名鼎鼎的光线追踪技术,这是后话,万丈高楼平地起,先从最基本的光照模型学起。
光照模型图
顶点着色器代码
//// Vertex shader for procedural bricks//// Authors: Dave Baldwin, Steve Koren, Randi Rost// based on a shader by Darwyn Peachey//// Copyright (c) 2002-2006 3Dlabs Inc. Ltd. //// See 3Dlabs-License.txt for license information//uniform vec3 LightPosition;const float SpecularContribution = 0.3;const float DiffuseContribution = 1.0 - SpecularContribution;varying float LightIntensity;varying vec2 MCposition;void main(){ 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();}
1.代码解析
uniform vec3 LightPosition; //光源位置
const float SpecularContribution = 0.3; //镜面反射强度影响
const float DiffuseContribution = 1.0 - SpecularContribution; //漫反射强度影响
varying float LightIntensity; //光照强度
varying vec2 MCposition; //模型坐标位置
vec3 ecPosition = vec3(gl_ModelViewMatrix * gl_Vertex); //用来存储传入顶点的眼睛坐标位置,即光线照射到物理表面顶点位置,通过使用openGL内置模型视图矩阵 乘以 顶点位置实现,也就是变换到眼睛能看到的物体顶点位置
vec3 tnorm = normalize(gl_NormalMatrix * gl_Normal); //用来存储变换后的法向量,即法向量变换矩阵 乘以 物体表面法向量,并归一化,即将其转换为单位长度的矢量
vec3 lightVec = normalize(LightPosition - ecPosition);//光照方向矢量,即光照位置减去物体对象位置,并归一化
vec3 reflectVec = reflect(-lightVec, tnorm); //reflect是openGL内置反射函数,lightVec为负,是因为我们以物体对象顶点为起点,以法线和入射光方向为终点,而入射光方向是从光源方向照射到物体对象表面,所以lightVec方向为负
vec3 viewVec = normalize(-ecPosition); //眼睛向量(摄像机向量),ecPosition为负,是因为我们以物体对象为起点,以眼睛(摄像机)方向为终点,而我们是以眼睛看向物体对象表面,所以ecPosition为负
float diffuse = max(dot(lightVec, tnorm), 0.0); //dot(lightVec, tnorm),//漫反射点乘的物理意义:两个向量的cosθ值,其中θ是两个向量的夹角, max(dot(lightVec, tnorm), 0.0):θ角度>90度,光线将进入物体对象内部,所以cosθ如果<0,一律>=0
spec = max(dot(reflectVec, viewVec), 0.0);//镜面反射点乘
spec = pow(spec, 16.0); //镜面反射锐化高光效果
LightIntensity = DiffuseContribution * diffuse + SpecularContribution * spec; //漫反射和镜面反射相互叠加
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~