目录

  • 概念
  • 补充
    • 法线矩阵(Normal Matrix)
    • 反射方向求解
  • Shader

概念

冯氏光照模型的主要结构由3个分量组成:环境(Ambient)、漫反射(Diffuse)和镜面(Specular)光照。所有向量都进行归一化(normalize)
P h o n g = ( A m b i e n t + D i f f u s e + S p e c u l a r ) ∗ o b j e c t C o l o r Phong=(Ambient+Diffuse+Specular) * objectColor Phong=(Ambient+Diffuse+Specular)∗objectColor
环境光:用光的颜色乘以一个很小的常量环境因子,再乘以物体的颜色
A m b i e n t = A m b i e n t S t r e n g t h ∗ L i g h t C o l o r Ambient = AmbientStrength * LightColor Ambient=AmbientStrength∗LightColor
漫反射:漫反射分量均匀的向四周传播,因此与视线无关,光线垂直于表面的分量。(光线与法向量成钝角时 漫反射不得为负)
D i f f u s e = K d ∗ L i g h t C o l o r ∗ m a x ( 0 , d o t ( l i g h t D i r , n ) ) Diffuse=K_d*LightColor*max(0,dot(lightDir,n)) Diffuse=Kd​∗LightColor∗max(0,dot(lightDir,n))
镜面反射:也叫高光。与平面反射光和视角有关。求解方法也是区分Phong和BlinnPhong的关键。后者引入半角向量(半程向量)(Halfway Vector).
S p e c u l a r = s p e c u l a r S t r e n g t h ∗ s p e c ∗ l i g h t C o l o r Specular=specularStrength * spec * lightColor Specular=specularStrength∗spec∗lightColor
Phong:
S p e c = p o w ( m a x ( d o t ( v i e w D i r , r e f l e c t D i r ) , 0.0 ) , s h i n i n e s s ) Spec = pow(max(dot(viewDir, reflectDir), 0.0), shininess) Spec=pow(max(dot(viewDir,reflectDir),0.0),shininess)
BlinnPhong:
S p e c = p o w ( m a x ( d o t ( n o r m a l , h a l f w a y D i r ) , 0.0 ) , s h i n i n e s s ) Spec = pow(max(dot(normal, halfwayDir), 0.0), shininess) Spec=pow(max(dot(normal,halfwayDir),0.0),shininess)
h a l f w a y D i r = l i g h t D i r + v i e w D i r halfwayDir=lightDir+viewDir halfwayDir=lightDir+viewDir
其中,shininess值越小,高光区域的半径越大,shininess值越大,高光区域的半径越小。Phong中观察向量和反射向量间的夹角大于90度高光就会为0,当物体的反光度( shininess)非常小时,它产生的镜面高光半径足以让这些相反方向的光线对亮度产生足够大的影响。例:非常倾斜的光线照射地板。这样的改动,能够修复 Phong光照模型的边界突然截止的问题。
半程向量与表面法线的夹角通常会小于观察与反射向量的夹角。所以,如果你想获得和冯氏着色类似的效果,就必须在使用Blinn-Phong模型时将镜面反光度设置更高一点。通常我们会选择冯氏着色时反光度分量的2到4倍。
https://learnopengl-cn.github.io/05%20Advanced%20Lighting/01%20Advanced%20Lighting/

补充

法线矩阵(Normal Matrix)

不等比缩放会导致原本模型法线在变换后不垂直于表面,需要使用法线矩阵进行转换。
法线矩阵被定义为「模型矩阵左上角3x3部分的逆矩阵的转置矩阵」
N o r m a l = m a t 3 ( t r a n s p o s e ( i n v e r s e ( m o d e l ) ) ) ∗ a N o r m a l ; Normal = mat3(transpose(inverse(model))) * aNormal; Normal=mat3(transpose(inverse(model)))∗aNormal;
矩阵求逆开销较大,最好先在CPU上计算出法线矩阵,再通过uniform把它传递给着色器(就像模型矩阵一样)。

反射方向求解


GLSL有内置函数reflect,求解原理如上图。

// i为入射光线,n为法线
float3 reflect( float3 i, float3 n )
{return i - 2.0 * n * dot(n,i);
}

Shader

VertexShader

 attribute vec3 aVertexPosition;attribute vec3 aNormalPosition;attribute vec2 aTextureCoord;uniform mat4 uModelViewMatrix;uniform mat4 uProjectionMatrix;varying highp vec2 vTextureCoord;varying highp vec3 vFragPos;varying highp vec3 vNormal;void main(void) {vFragPos = aVertexPosition;vNormal = aNormalPosition;gl_Position = uProjectionMatrix * uModelViewMatrix * vec4(aVertexPosition, 1.0);vTextureCoord = aTextureCoord;}

fragment

 uniform sampler2D uSampler;//binnuniform vec3 uKd;uniform vec3 uKs;uniform vec3 uLightPos;uniform vec3 uCameraPos;uniform float uLightIntensity;uniform int uTextureSample;varying highp vec2 vTextureCoord;varying highp vec3 vFragPos;varying highp vec3 vNormal;void main(void) {vec3 color;//检测有无纹理if (uTextureSample == 1) {color = pow(texture2D(uSampler, vTextureCoord).rgb , vec3(2.2));} else {color = uKd;}
vec3 ambient = 0.05 * color;vec3 lightDir = normalize(uLightPos - vFragPos);vec3 normal = normalize(vNormal);float diff = max(dot(lightDir , normal), 0.0);float light_atten_coff = uLightIntensity / length(uLightPos - vFragPos);vec3 diffuse = diff * light_atten_coff * color;vec3 viewDir = normalize(uCameraPos - vFragPos);float spec = 0.0;//Phong
// vec3 reflectDir = reflect(-lightDir , normal);
// spec = pow (max(dot(viewDir, reflectDir), 0.0), 35.0);
vec3 halfwayDir =  normalize(lightDir+viewDir);
spec = pow (max(dot(normal, halfwayDir), 0.0), 35.0);
vec3 specular = uKs * light_atten_coff * spec;gl_FragColor = vec4(pow((ambient + diffuse + specular), vec3(1.0/2.2)), 1.0);}

glsl 中 浮点型精度被分为 lowp,mediump, highp 三种。一般来说 顶点的位置会选用highp, texture coordinate 选用mediump,colors 选用lowp。

【图形学】布林冯BlinnPhong相关推荐

  1. 【ShaderLab】Phong与Blinn-Phong两个光照模型的理解

    正文        (顺手抄来一个图) Phong与Blinn-Phong两个光照模型都是用来实现光照射在物体上,物体表现产生一个高光部分的效果的,两个模型也十分相似,毕竟后者是对前者进行了一个计算上 ...

  2. [计算机图形学]材质与外观(前瞻预习/复习回顾)

    一.图形学中的材质 不同的物体表面有着不同的材质,而不同的材质意味着它们与光线的作用不同.那么我们之前在介绍辐射度量学和渲染方程提到过其中一个函数,叫做BRDF,而在实际上,也就是BRDF定义了不同的 ...

  3. Games101 学习笔记

    文章目录 第一章 第二章 线性代数 向量 单位向量: 向量相加: 笛卡尔坐标系: 向 量乘法: 点乘 叉乘 标准正交基orthonormal 矩阵 矩阵乘法 性质: 矩阵的转置: 单位矩阵和逆矩阵 用 ...

  4. TA课程笔记01——光照(主要为shader入门精要第六章)

    //老师在这里简单的简述了一下渲染流水线,我在之前的图形学笔记中很详细的讲述了渲染流水线的过程,便不再赘述 //因为老师很详细的将几种常见的光照模型都讲了一遍,但都是美术方向,前面的案例也都缺少代码, ...

  5. Real-Time Rendering 4th 译文《九 基于物理渲染(中)》

    9.5.3 内部反射 虽然在渲染中经常遇到外部反射,但内部反射有时也很重要.n1>n2时发生内反射.换句话说,当光在透明对象的内部传播并"从内部"遇到对象的表面时,会发生内反 ...

  6. 太极图形课S1第06讲:光线追踪的概念与基础

    序 总觉得,这个以后能用的上 视频 太极图形课S1第06讲:光线追踪的概念与基础_哔哩哔哩_bilibili 代码 GitHub - taichiCourse01/taichi_ray_tracing ...

  7. Unity3d轻量渲染管线(LWRP)民间文档

    转载:https://blog.csdn.net/weixin_42163773/article/details/84317223 近日在学习Unity3d的SRP,由于官方未正式发布,故几乎没有文档 ...

  8. opengl高级光照之延迟渲染以及光体积

    延迟着色法 延迟着色法官方文档 我们现在一直使用的光照方式叫做正向渲染(Forward Rendering)或者正向着色法(Forward Shading),它是我们渲染物体的一种非常直接的方式,在场 ...

  9. vulkan_延迟渲染

    延迟渲染 一.简述 我们现在一直使用的光照方式叫做正向渲染(Forward Rendering)或者正向着色法(Forward Shading),它是我们渲染物体的一种非常直接的方式,在场景中我们根据 ...

最新文章

  1. C++核心编程(四)--文件操作
  2. Emm,qW3xT.2(矿机进程)
  3. 微型计算机开机密码丢失,校诡实录微机教室攻略 电脑密码是多少[多图]
  4. MQ消息队列之MSMQ
  5. java内部格式_详解java内部类的访问格式和规则
  6. python redis 消息队列_Python的Flask框架应用调用Redis队列数据的方法
  7. 开发基础框架:mybatis-3.2.8 +hibernate4.0+spring3.0+struts2.3
  8. 基于JAVA+SpringMVC+Mybatis+MYSQL的高校学习智能管理论坛系统
  9. idea配置jfinal_JFinal 开箱评测,这次我是认真的
  10. Spring Data JPA 常用 CRUD 操作汇总 及 关联关系( 操作 h2 内存数据)
  11. 【路径规划】基于matlab Beizer和改进的粒子群算法风环境下翼伞航迹规划【含Matlab源码 199期】
  12. GEE生成京津冀区域VIIRS 夜间灯光数据
  13. resnet50能用cpu跑吗_用最简单的方式训练史上最强ResNet-50,性能超过魔改结构的ResNeSt...
  14. socket服务器针对客户端ip变更的处理办法
  15. 程序员需要学会宏观看待问题
  16. nginx中location匹配规则与proxy_pass代理转发
  17. 结合PROFINET和OPC UA的优势监控现代化设备
  18. 姿态角速度和机体角速度,横摆角速度(Yaw Rate)估算
  19. 纯千兆电口模块和自适应电口模块的区别
  20. 长尾理论读书笔记:第一章 长尾市场

热门文章

  1. 关于背景图background-image
  2. 【vulhub】gitea
  3. iOS应用程序的辅助功能:语音识别
  4. Equalize the Remainders(思维)
  5. Mac下Go的安装与配置
  6. APP内置H5分享到微信
  7. 之江实验室牵手国科大杭高院 重磅启动全方位合作
  8. sourcetree教程(去掉注册账号)
  9. 企业上云后,不容忽视的管理工具-云管平台
  10. “阿里和腾讯谁的技术更好?”阿里王坚的机智回答瞬间化解尴尬!