Opengl 4种光照模型

https://blog.csdn.net/ym19860303/article/details/25545933

1.Lambert模型(漫反射)

环境光:

Iambdiff = Kd*Ia

其中Ia 表示环境光强度,Kd(0<K<1)为材质对环境光的反射系数,Iambdiff是漫反射体与环境光交互反射的光强。

方向光:

Ildiff = Kd * Il * Cos(θ)

其中Il是点光源强度,θ是入射光方向与顶点法线的夹角,称入射角(0<=A<=90°),Ildiff是漫反射体与方向光交互反射的光强,若 N为顶点单位法向量,L表示从顶点指向光源的单位向量(注意顶点指向光源),则Cos(θ)等价于dot(N,L),故又有:

Ildiff = Kd * Il * dot(N,L)

最后综合环境光和方向光源,Lambert光照模型可以写成:

Idiff = Iambdiff + Ildiff = Kd * Ia + Kd * Il * dot(N,L)

2.Phong模型(镜面反射)

Phong模型认为镜面反射的光强与反射光线和视线的夹角相关:

Ispec = Ks * Il * ( dot(V,R) )^Ns

其中Ks 为镜面反射系数,Ns是高光指数,V表示从顶点到视点的观察方向,R代表反射光方向。由于反射光的方向R可以通过入射光方向L(从顶点指向光源)和物体的法向量求出,
R + L = 2 * dot(N, L) * N  即 R = 2 * dot(N,L) * N - L

所以最终的计算式为:

Ispec = Ks * Il * ( dot(V, (2 * dot(N,L) * N – L ) )^Ns

3.Blinn-Phong光照模型(修正镜面光)

Blinn-Phong是一个基于Phong模型修正的模型,其公式为:

Ispec = Ks * Il * ( dot(N,H) )^Ns

其中N是入射点的单位法向量,H是光入射方向L和视点方向V的中间向量,通常也称之为半角向量(半角向量被广泛用于各类光照模型,原因不但在于半角向量蕴含的信息价值,也在于半角向量是很简单的计算:H = (L + V) / |L + V|  )。

4.Rendering Equation(全局光照模型)

Rendering Equation 是Kajia在1986年提出的,

Lo(X, Wo) = Le(X, Wo) + ∫fr(X, Wi, Wo) Li(X, Wi) dot(N, Wi) dWi

其中X表示入射点,Lo(X, Wo)即从物体表面X点,沿方向Wo反射的光强,Le(X, Wo)表示从物体表面X以方向Wo 发射出去的光强,该值仅对自发光体有效,fr(X, Wi, Wo)为,入射光线方向为Wi, 照射到点X上,然后从Wo方向发射出去的BRDF值,Li(X, Wi)为入射方向为Wi照射到点X上的入射光强,N表示点X处的法向量,然后对入射方向进行积分(因为光线入射的方向是四面八方的,积分的意义是对每个方向进行一遍计算后相加),计算的结果就是全局光照的辐射率。

对于单个点光源照射到不会自发光的物体上,公式可以简化成:

Lo(X, Wo) = fr(X, Wi, Wo) Li(X, Wi) dot(N, Wi)

这个公式非常有用,通常会将该公式分解为漫反射表达式和镜面表达式之和。对于漫反射表面,BRDF可以忽略不计,因为它总是返回某个恒定值,所以可以写成如下形式:

Lo(X, Wo) = Idiff + frs(X, Wi, Wo) Li(X, Wi) dot(N, Wi)

其中Idiff表示漫反射分量,使用公式的计算方法,frs(X, Wi, Wo)表示镜面反射的BRDF函数,前面的Phong高光模型,其实是rendering equation在单一光源下针对理想镜面反射的特定推导,对于Phong高光而言:

frs(X, Wi, Wo) = Ks (dot(N, H)^Ns  / dot(N, Wi)

//-------------------------------------------------------------------------------------------------------------------------

几种光照模型的比较

Lambert 模型能够较好地表现粗糙表面上的光照现象,如石灰墙,纸张等等,但是在渲染金属材质制成的物体时,则会显得呆板,表现不出光泽,主要原因是其没有考虑到镜面反射效果,所以Phong模型对其进行了很好的补充。由于Blinn-phng光照模型混合了Lambert的漫射部分和标准的高光,渲染效果有时会比 Phong高光更柔和,有些人认为phong光照模型比blinn-phong更加真实,实际上也是如此,Blinn-phong渲染效果要更加柔和一些,但是由于Blinn-phong的光照模型省去了计算反射光线方向向量的两个乘法运算,速度更快,因此成为许多CG软件中默认的光找渲染方法,此外它也继承在了大多数图形芯片中,用以产生实时的快速渲染。在OpenGL和Direct3D渲染管线中,Blinn-Phong就是默认的渲染模型。 Rendering Equation是基于物理光学的模型,其对于观察方向上的辐射率进行了本质上的量化,Phong模型只是其特定BRDF的推导。

以下给出Blinn-Phong的CG片段,用于参考实现:

struct VertexScreen
{
    float4 oPosition : POSITION;
    float4 objectPos : TEXCOORD0;
    float4 objectNormal : TEXCOORD1;
};

void main_f(VertexScreen posIn,
    out float4 color : COLOR,
    uniform float4x4 worldMatrix,
    uniform float4x4 worldMatrix_IT,
    uniform float3 globalAmbient,
    uniform float3 eyePosition,
    uniform float3 lightPosition,
    uniform float3 lightColor,
    uniform float3 Kd,
    uniform float3 Ks,
    uniform float shininess)
{
    float3 worldPos = mul(worldMatrix, posIn.objectPos).xyz;
    float3 N = mul(worldMatrix_IT, posIn.objectNormal).xyz;
    N = normalize(N);

//计算入射光方向\视线方向\半角向量
    float3 L = normalize(lightPosition - worldPos);
    float3 V = normalize(eyePosition - worldPos);
    float3 H = normalize(L + V);

// 计算漫反射分量
    float3 diffuseColor = Kd * globalAmbient+Kd*lightColor*max(dot(N, L), 0);
 
    //计算镜面反射分量
    float3 specularColor = Ks * lightColor*pow(max(dot(N, H), 0), shininess);
    color.xyz = diffuseColor + specularColor;
    color.w = 1;
}

原文地址:https://www.cnblogs.com/nafio/p/12268355.html

时间: 2024-08-30 04:12:09

Opengl 4种光照模型的相关文章

opengl两种投影类型

openGL两种投影方式 from http://hi.baidu.com/fcqian/blog/item/cc5794ec76807a3f27979131.html 投影变换是一种很关键的图形变换,OpenGL中只提供了两种投影方式,一种是正射投影,另一种是透视投影.不管是调用哪种投影函数,为了避免不必要的变换,其前面必须加上以下两句: glMAtrixMode(GL_PROJECTION); glLoadIdentity(); 事实上,投影变换的目的就是定义一个视景体,使得视景体外多余的部

OpenGL几种绘制方式

OpenGL几种绘制方式 OpenGL 绘制 本文介绍了OpenGL的几种绘制方式及各自特点.绘制方式如下: 立即模式 显示列表 顶点数组 VBO 1.立即模式 最直接的方式,传统的使用glBegin...glEnd绘制的方式,如下所示: glBegin( GL_TRIANGLES ); glVertex3f(-1.0f, -0.5f, -4.0f); glVertex3f( 1.0f, -0.5f, -4.0f); glVertex3f( 0.0f, 0.5f, -4.0f); glEnd()

4种基本光照模型

1.Lambert模型(漫反射) 环境光: Iambdiff = Kd*Ia 其中Ia 表示环境光强度,Kd(0<K<1)为材质对环境光的反射系数,Iambdiff是漫反射体与环境光交互反射的光强. 方向光: Ildiff = Kd * Il * Cos(θ) 其中Il是点光源强度,θ是入射光方向与顶点法线的夹角,称入射角(0<=A<=90°),Ildiff是漫反射体与方向光交互反射的光强,若 N为顶点单位法向量,L表示从顶点指向光源的单位向量(注意顶点指向光源),则Cos(θ)等

OpenGL ES 光照模型之——环境光照(RenderMonkey测试)

概述及目录(版权所有,请勿转载 www.cnblogs.com/feng-sc/) 本文总结如何在RenderMonkey下做简单的OpenGL ES环境光光照模型测试. 主要包括如下内容: 1.使用RenderMonkey创建一个简单的工程 2.环境关照模型分析及相应输入数据创建 3.Shader代码编写 4.效果展示 使用RenderMonkey创建一个简单的工程 RenderMoney创建一个OpenGL ES渲染工程很简单,大家只需根据下面图片步骤即可创建一个纯色的球体模型渲染工程. (

三维图像技术与OpenGL基础理论

英文原文:3D Graphics with OpenGL Basic Theory 中文译文:三维图像技术与OpenGL基础理论 1. 计算机图像硬件 1.1 GPU(图像处理单元) 如今,计算机拥有用来专门做图像处理显示的GPU模块,拥有独立的图像处理储存(显存). 1.2 像素和画面 任何图像显示都是基于栅格的格式.一个栅格既是一张二维的像素直角坐标网.像素具有两个属性:颜色和位置.颜色通常使用RGB(红绿蓝)来表示,典型的有用8位或者24位二进制位(真彩色)表示一种颜色.位置则用坐标(x,

清华版CG 实验7 OpenGL光照

一.实验目的: 了解掌握OpenGL程序的光照与材质,能正确使用光源与材质函数设置所需的绘制效果. 二.实验内容: (1)下载并运行Nate Robin教学程序包中的lightmaterial程序,试验不同的光照与材质系数: (2)运行示范代码1,了解光照与材质函数使用. 三.实验原理: 为在场景中增加光照,需要执行以下步骤: (1) 设置一个或多个光源,设定它的有关属性: (2) 选择一种光照模型: (3) 设置物体的材料属性. 具体见教材第8章8.6节用OpenGL生成真实感图形的相关内容.

OpenGL入门学习

说起编程作图,大概还有很多人想起TC的#include <graphics.h>吧? 但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640*480分辨率.16色来做吗?显然是不行的. 本帖的目的是让大家放弃TC的老旧图形接口,让大家接触一些新事物. OpenGL作为当前主流的图形API之一,它在一些场合具有比DirectX更优越的特性. 1.与C语言紧密结合. OpenGL命令最初就是用C语言函数来进行描述的,对于学习过C语言的人来讲,OpenGL是容易理解和学习的

OpenGL透明与混色效果

在OpenGL中,物体透明技术通常被叫做混合(Blending). 透明是物体(或物体的一部分)非纯色而是混合色,这种颜色来自于不同浓度的自身颜色和它后面的物体颜色. 一个有色玻璃窗就是一种透明物体,玻璃有自身的颜色,但是最终的颜色包含了所有玻璃后面的颜色.这也正是混合这名称的出处,因为我们将多种(来自于不同物体)颜色混合为一个颜色,透明使得我们可以看穿物体. 透明物体可以是完全透明(它使颜色完全穿透)或者半透明的(它使颜色穿透的同时也显示自身颜色).一个物体的透明度,被定义为它的颜色的alph

【转】OpenGL概述

英文原文 中文译文 1. 计算机图像硬件 1.1 GPU(图像处理单元) 如今,计算机拥有用来专门做图像处理显示的GPU模块,拥有独立的图像处理储存(显存). 1.2 像素和画面 任何图像显示都是基于栅格的格式.一个栅格既是一张二维的像素直角坐标网.像素具有两个属性:颜色和位置.颜色通常使用RGB(红绿蓝)来表示,典 型的有用8位或者24位二进制位(真彩色)表示一种颜色.位置则用坐标(x,y)表示.原点(0,0)位于左上角,x轴指向右,y轴指向下.这与我们平常 熟知的2D笛卡尔坐标不同,它的y轴