我们通过这张图可以看出来,使用了法线贴图的物体表面更有细节更逼真,其实这就是发现贴图的作用,没什么钻牛角尖的。

其实表面没有凹凸的情况是因为我们把表面一直按照平整来做的,要想突出这个表面的凹凸就要用到法线贴图

到这里,我们暂停想一下,前面说的几种贴图,漫反射贴图,镜面光贴图,然后再到这个法线贴图。明白了什么?其实很简单,就是我们法线虚拟的和现实的差距就会通过这种贴图的形式来着重表现某一方面的效果。

#version 330 core
out vec4 FragColor;in VS_OUT {vec3 FragPos;vec2 TexCoords;vec3 TangentLightPos;vec3 TangentViewPos;vec3 TangentFragPos;
} fs_in;uniform sampler2D diffuseMap;
uniform sampler2D normalMap;uniform vec3 lightPos;
uniform vec3 viewPos;void main()
{// obtain normal from normal map in range [0,1]vec3 normal = texture(normalMap, fs_in.TexCoords).rgb;// transform normal vector to range [-1,1]normal = normalize(normal * 2.0 - 1.0);  // this normal is in tangent space// get diffuse colorvec3 color = texture(diffuseMap, fs_in.TexCoords).rgb;// ambientvec3 ambient = 0.1 * color;// diffusevec3 lightDir = normalize(fs_in.TangentLightPos - fs_in.TangentFragPos);float diff = max(dot(lightDir, normal), 0.0);vec3 diffuse = diff * color;// specularvec3 viewDir = normalize(fs_in.TangentViewPos - fs_in.TangentFragPos);vec3 reflectDir = reflect(-lightDir, normal);vec3 halfwayDir = normalize(lightDir + viewDir);float spec = pow(max(dot(normal, halfwayDir), 0.0), 32.0);vec3 specular = vec3(0.2) * spec;FragColor = vec4(ambient + diffuse + specular, 1.0);
}

这是一个法线贴图的片段着色器,我们可以看到几个关键的部分。

  1. vec3 normal = texture(normalMap, fs_in.TexCoords).rgb; 我们从法线贴图的纹理中取样像素
  2. 我们从 diffuseMap 中取样 物体纹理图片的原本像素
  3. 然后我们把normal的普通的做了综合得出了最终的FragColor

这里面还有TagnetFragPos什么的不理解没关系,它们是切线空间的一些概念


切线空间

法线贴图中的法线向量在切线空间中,法线永远指着正z方向。切线空间是位于三角形表面之上的空间:法线相对于单个三角形的本地参考框架。它就像法线贴图向量的本地空间;它们都被定义为指向正z方向,无论最终变换到什么方向。使用一个特定的矩阵我们就能将本地/切线空寂中的法线向量转成世界或视图坐标,使它们转向到最终的贴图表面的方向。
切线空间中的T(tangent),B(Bitangent)与贴图U,V方向一致。 保存方式(T,B,N)


Normal


T(tangent)


B(Bitangent) = N*T


最终效果

Opengl-法线贴图(用来细化表面的表现表现的凹凸)相关推荐

  1. openGL法线贴图和纹理贴图结合使用,以增强三维物体表面细节

    openGL系列文章目录 文章目录 openGL系列文章目录 前言 一.法线贴图? 二.代码 1.主程序 2.着色器程序 运行效果 源码下载 前言 凹凸贴图的一种替代方法是使用查找表来替换法向量.这样 ...

  2. OpenGL 法线贴图Normal Mapping

    OpenGL法线贴图Normal Mapping 法线贴图Normal Mapping简介 法线贴图 切线空间 手工计算切线和副切线 切线空间法线贴图 复杂物体 最后一件事 法线贴图Normal Ma ...

  3. 【视觉高级篇】25 # 如何用法线贴图模拟真实物体表面

    说明 [跟月影学可视化]学习笔记. 什么是法线贴图? 法线贴图就是在原物体的凹凸表面的每个点上均作法线,通过RGB颜色通道来标记法线的方向,你可以把它理解成与原凹凸表面平行的另一个不同的表面,但实际上 ...

  4. OpenGL 法线贴图 切线空间 整理

    1. What`s Bump Mapping? Bump Mapping通过改变几何体表面各点的法线,使本来是平的东西看起来有凹凸的效果,是一种欺骗眼睛的技术:). 我们知道,如果几何体表面有高低不平 ...

  5. shader graph_在Shader Graph中使用表面梯度框架进行法线贴图合成

    shader graph A recent Unity Labs paper introduces a new framework for blending normal maps that is e ...

  6. 技术美术知识学习_06:关于法线贴图详解

    一.什么是法线贴图 法线贴图说明: 法线贴图就是在原物体的凹凸表面的每个点上均作法线,通过RGB颜色通道来标记法线的方向,你可以把它理解成与原凹凸表面平行的另一个不同的表面,但实际上它又只是一个光滑的 ...

  7. Unity Shader法线贴图(Normal Map)及其原理

    简介 以前经常听说"模型不好看啊,怎么办啊?"答曰"加法线","做了个高模,准备烘一下法线贴图","有的美术特别屌,直接画法线贴图 ...

  8. 法线贴图Nomal mapping 原理

    法线贴图多用在CG动画的渲染以及游戏画面的制作上,将具有高细节的模型通过映射烘焙出法线贴图,贴在低端模型的法线贴图通道上,使之拥有法线贴图的渲染效果,却可以大大降低渲染时需要的面数和计算内容,从而达到 ...

  9. shader 获取法线_Unity Shader 入门到改行5——法线贴图

    the best of blur 1. 法线贴图理论 1.1 什么是法线贴图 一般的贴图中存储的是表面颜色值(RGBA),而法线贴图存放的则是法线信息(xyzw),假设某顶点处的 uv 坐标为 (u, ...

最新文章

  1. 输入4个同学的姓名学号,语文数学英语信息计算平均成绩,按平均成绩高低排序输出java,c++实现
  2. 【转】OGRE资源相关分析
  3. LBFT跨链共识机制
  4. 怎样让你的安卓手机瞬间变Firefox os 畅玩firefox os 应用
  5. 【专题介绍】视频内容生产与消费创新(Part2)
  6. MAC使用终端DISKUTIL命令给U盘分区(解决window优盘只有200M)
  7. java 文件输出流_Java 文件输出流
  8. python棋盘最短路径_Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例...
  9. html显示当前时间_HTML基础教程:超链接的使用
  10. itext生成pdf间距_使用itext生成pdf
  11. python日记Day12——numpy速查中文手册
  12. 计算机c盘内存怎么转给d盘,C盘空间太大怎么把空间转到D盘或E盘
  13. 验证码接码短信平台 - 小程序版
  14. html视频自动播放播放器,支持弹字幕HTML5视频播放器DPlayer
  15. 用STM32F103完成对SD卡的数据读取
  16. 大事•Pandownload凉了
  17. 计算机考研考的数学题,2019计算机考研数学七个小窍门快速答题
  18. Redis list分页功能
  19. Python基础部分学习笔记(一)
  20. 中学计算机教材,人教版初中信息技术教材梳理

热门文章

  1. linq语句复杂查询和分开查询的性能对比
  2. Homebrew--MacOSX下的套件管理器
  3. mysql select 报错
  4. Talairach空间、MNI空间、Native空间、Stereotaxic空间
  5. Android中用 adb 命令操作数据库
  6. python编译器在哪下载-Python-IDLE的下载安装及使用
  7. python数据类型-Python3基本数据类型(一、数字类型)
  8. python爬虫用途-Python爬虫入门知识:解析数据篇
  9. python语言怎么输入-python如何用input输入数组
  10. python课程将主要介绍哪些内容-Python窗口的基本介绍