OpenGL_ES-光照(上)

一:基础定义

1:颜色定义:

对于大多数计算机显示器来说,颜色信息的显示只是依靠三种光波的组合:红,绿,蓝.所以颜色可以用红,绿,蓝三元素表示,每个  
分量都在0到1区间,颜色即能够代表光的光谱成分,也能代表光的强度.颜色可用和一个三维向量表示,有加法和乘法.

2:光源:

1):环境光:环境光是一种低强度的光,由光线经过周围环境表面多次反射后形成的,利用环境光可以描述一块区域的亮度,通常在场 
景中,环境光的颜色是一个常量.

2):太阳光:即定向光源,特点是从无穷远出发射光线,光线是平行的,光线强度不会随着距离衰减.

3):点光源:在有限空间内某个点上发出的光线,光线强度会随着距离衰减.衰减系数一般是距离的二次多项式倒数.

4):聚光灯:特点是有主照射方向,强度随着距离衰减,并且光线延着中心向外衰减.


二:漫反射

理想的漫反射表面把光线向所有方向均匀的散射,因此,这样的表面在所有观察者看来亮度都一样,理想的慢反射表面是如此粗糙,以至于向各个方向反射的光线强度都相等.这样的表面被成为Lambert表面(兰博特),OpenGL固定管线,或者Shader基于这个定律来建模.

漫反射公式推导:

1: 先看看漫反射强度跟哪些参数有关系?  , 如图所示:

对于横截面积为A的光束, 其被光束照射的面积是A/[email protected], 也就说明单位面积上,光的强度是以[email protected]系数进行衰减的, 那么[email protected]又是光线和表面法线的点乘.

2: 慢反射公式推导:

设@是法向量N, 和光源L之间的夹角, 则, [email protected] = L*N;

设慢反射系数K, 则慢反射光强度I  =  K(L*N);

设光线传播衰减系数为  1/(a + bd + cd^2); 则  I  = [1/(a + bd + cd^2)] *  K(L*N);

Shader例子:

 vec3normal; //光照平面的法线 V

vec3position; //光源位置 P

float dotVP; //法线和光源向量点乘值

float diffause; //光的漫反射颜色

dotVP =dot(normal, position); //向量点乘

dotVP =max(dotVP, 0); //当法线和光源向量夹角为顿角的就没有光照了.

floatDiffause = diffause*dotVP; //漫反射结果(没有加距离衰减)

三:镜面反射

相信大家小时候玩过镜子,镜子反射光时会很耀眼,镜面反射会形成强烈的光反射,反射的路线与入射方向
和表面法线形成的反射方向保持一致,镜面反射依赖于观察者所处的位置.当反射方向指向观察者时,光线最强,当反射光线离开观察者时,光线强度呈指数下降;

镜面反射公式推导:

具体公式推导过程:如图所示,
V: 观察者, R: 反射光线, N:法线, L: 入射光线; S: 反射颜色, C:入射光强度,m镜面指数;

镜面指数m控制镜面强光的集中程度, 小的m值产生模糊的强光, 大的m值产生明显的强光. 一个对镜面强光进行描述的可信模型:

镜面反射值 = S*C*(max(R*V,0)^m), 条件是(N*L>0);

这个模型的含义是, 当光线与法线成锐角时, 观察者能接收到反射光线, 并且强度随着发射光线与观察者夹角成指数变化.

虽然这个模型能计算出镜面反射, 每一次计算,都涉及到反射光线, 但实际中,反射光线可能有无数条, 计算量太大, 能否有一种简化模型呢.

一种办法是, 在光源位置向量与观察者向量, 取一个中间向量, 叫做平分向量H, 如图所示:

当H和法线N重合时, 反射到观察者的光线最近, 当H和法线N角度变大时,光线减弱. 由此,调整反射模型为:

镜面反射值 = S*C*(max(H*N,0)^m), 条件是(N*L>0)

Shader例子:

 vec3normal; //光照平面的法线V

vec3halfVector; //光线平分向量方向H,含义参见上一篇博客

floatdotHV; //法线和光线点乘值

floatshininess; //镜面指数,控制镜面强光集中度

floatspecular; //镜面反射颜色

dotHV= dot(normal, halfVector); //光线平分向量与法线点乘

dotHV= max(0, dotHV);//夹角呈顿角按0值处理

floatpf = 0.0;//光线反射强度

pf= pow(dotHV, shininess);

specular= specular * pf; //反射结果(没有加距离衰减)

时间: 2024-10-19 09:11:37

OpenGL_ES-光照(上)的相关文章

Unity5 GI与PBS渲染从用法到着色代码

本文主要介绍Untiy5以后的GI,PBS,以及光源探头,反射探头的用法以及在着色器代码中如何发挥作用,GI是如何影响渲染的,主要分成三个部分,最开始说明PBS需要的材质与相应概念,二是Unity 里相应GI的操作,三是对应着色器代码的理解.如果没有特殊声明,所有操作与代码都是针对Unity5.3. PBS材质与概念 简单来说,PBS的优点不同的照明下获得一致的外观,更容易实现,更直观的参数. PBS材质概念: 1.albedo 反照率 反照率贴图定义漫反射的基本颜色,与原来的漫反射贴图相比,不

Thinking in Unity3D:基于物理着色(PBS)的材质系统

关于<Thinking in Unity3D> 笔者在研究和使用Unity3D的过程中,获得了一些Unity3D方面的信息,同时也感叹Unity3D设计之精妙.不得不说,笔者最近几年的引擎研发工作中,早已习惯性的从Unity3D中寻找解决方案. Unity3D虽比不上UE那么老练沉稳,气势磅礴.也比不上CE那样炫丽多姿,盛气凌人.但它的发展势如破竹,早已遍地生花!故而在此记录一些自己的心得体会,供大家参详交流.若有欠妥之处,还望各位及时指正. Thinking in Unity3D由一系列文章

Spherical Harmonics Lighting

[转自:http://www.cnblogs.com/daniagger/archive/2012/05/29/2524133.html] 1.背景知识 1.1 光照表示 之前我们都只考虑光源点和物体表面点的光照作用,而现在,我们考虑物体表面点延伸的微型平面,这个微型平面作为半球形的底部,因此光照射进来的范围就是整个半球形,这也是BRDF的基础. 1.2 数据压缩 对于压缩信号来说,很多压缩技术基于这样一个思路:使用不同基函数的不同组合来组成一个更为复杂的数字信号表示. 保存数字信号的最繁琐方法

Unity5内部渲染的优化3:移除固定功能

译自aras的博客,总共3篇文章,讲述unity5优化自己渲染器的过程 吸取大神调试与优化经验,了解unity5内部渲染器的优化方法 第一篇:Unity5内部渲染的优化1:介绍 第二篇:Unity5内部渲染的优化2:清理 上篇文章写了关于清理和优化.从那时起,我已经转变到做一些unity5.1的工作了,移除了固定功能着色器Fixed Function Shaders和一些别的事. 固定功能是什么 以前,GPU还没有"可编程着色器programmable shaders":通过启用和禁用

Unity5-----------之GI设置简介

GI global illumination 全局照明indirect illumination 间接照明模拟出光线追踪的效果 实现方法:1.ssao系列 2.lightmap.辐射度3.PBRT 实时GI:LPV cryengine <Cascaded Light Propagation Volumes for Real-Time Indirect Illumination>SVO ue4 <Interactive Indirect Illumination Using Voxel C

【DirectX11】第八篇 光照模型——漫反射

本系列文章主要翻译和参考自<Real-Time 3D Rendering with DirectX and HLSL>一书(感谢原书作者),同时会加上一点个人理解和拓展,文章中如有错误,欢迎指正. 这里是书中的代码和资源. 本文所有的环境和工具使用都基于之前的文章,如有不明白的地方请先参考本系列之前的几篇文章. 本文索引: 关于灯光 Diffuse Lighting 漫反射光照 1 Directional Lights 平行光 2 Diffuse Lighting Effect Preambl

虚幻引擎 4 14 版发布

Share on Facebook Share on Twitter Share on Google+ Share on LinkedIn 此版包含 Epic 的数百项更新,以及 GitHub 虚幻引擎开发者社区提交的 71 项改良!特此对虚幻引擎 4.14 版本的每位贡献者表达诚挚谢意: Adam Moss(adamnv).Alan Edwardesa(alanedwardes).Andreas Axelsson (judgeaxl).Andreas Schultes(andreasschul

OpenGL(十一) 可编程管线 基础光照 的实现

在OpenGL中创建 基础光照 ,主要的工作将模型中的法线信息和法线空间运算矩阵传入到shader中.另一方面,LightDir,ViewDir通常是在shader中从引擎参数获取的,为了简化光照模型的实现,这里我们可以在shader中写死.至于经典的 ambient+diffuse+specular 光照原理,不是本文的重点,就在shader中一笔带过了. 原理 通过函数 glm::mat4 normalMatrix = glm::inverseTranspose(s_shaderData.m

Unity预计算全局光照的学习(速度优化,LightProbe,LPPV)

1.基本参数与使用 1.1 常规介绍 使用预计算光照需要在Window/Lighting面板下找到预计算光照选项,保持勾选预计算光照并保证场景中有一个光照静态的物体 此时在编辑器内构建后,预计算光照开始生效. 相关的文章有很多,unity官方有一系列文章不错: https://unity3d.com/cn/learn/tutorials/topics/graphics/introduction-precomputed-realtime-gi 在Lighting面板的Scene页签下可以设置全局光

Vertex中实现每顶点光照的镜面高光效果

1,基础知识讲解 一个物体在自然界会收到三种光的影响,周围的环境光.漫反射和镜面反射.那么对于计算机要想模拟现实中的光照,就应该也会实现这三种基本光照->环境光.漫反射.镜面高光.对于这三种光照,都存在着一定的影响因素,这就需要去追究其光照模型的公式了. (1),环境光强影响因素  ,由此可看出环境光照的效果取决于一般环境光的强度  和漫反射的材质颜色  (2),漫反射光强影响因素 由此可看出,漫反射的反射光取决于入射光强度  和材质常数,对于黑色表面,材质常数  的值是 0,对于白色表面,材质