openGL着色语言笔记

网友投稿 827 2022-11-20

openGL着色语言笔记

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小时内删除侵权内容。

上一篇:Visual Studio设置shader(CG 、GLSL)语法提示及高亮和显示行号 使用GLSL language integration插件
下一篇:openGL细分着色器详解
相关文章

 发表评论

暂时没有评论,来抢沙发吧~