Opengl-法线贴图(用来细化表面的表现表现的凹凸)
我们通过这张图可以看出来,使用了法线贴图的物体表面更有细节更逼真,其实这就是发现贴图的作用,没什么钻牛角尖的。
其实表面没有凹凸的情况是因为我们把表面一直按照平整来做的,要想突出这个表面的凹凸就要用到法线贴图
到这里,我们暂停想一下,前面说的几种贴图,漫反射贴图,镜面光贴图,然后再到这个法线贴图。明白了什么?其实很简单,就是我们法线虚拟的和现实的差距就会通过这种贴图的形式来着重表现某一方面的效果。
#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);
}
这是一个法线贴图的片段着色器,我们可以看到几个关键的部分。
- vec3 normal = texture(normalMap, fs_in.TexCoords).rgb; 我们从法线贴图的纹理中取样像素
- 我们从 diffuseMap 中取样 物体纹理图片的原本像素
- 然后我们把normal的普通的做了综合得出了最终的FragColor
这里面还有TagnetFragPos什么的不理解没关系,它们是切线空间的一些概念
切线空间
法线贴图中的法线向量在切线空间中,法线永远指着正z方向。切线空间是位于三角形表面之上的空间:法线相对于单个三角形的本地参考框架。它就像法线贴图向量的本地空间;它们都被定义为指向正z方向,无论最终变换到什么方向。使用一个特定的矩阵我们就能将本地/切线空寂中的法线向量转成世界或视图坐标,使它们转向到最终的贴图表面的方向。
切线空间中的T(tangent),B(Bitangent)与贴图U,V方向一致。 保存方式(T,B,N)
Normal
T(tangent)
B(Bitangent) = N*T
最终效果
Opengl-法线贴图(用来细化表面的表现表现的凹凸)相关推荐
- openGL法线贴图和纹理贴图结合使用,以增强三维物体表面细节
openGL系列文章目录 文章目录 openGL系列文章目录 前言 一.法线贴图? 二.代码 1.主程序 2.着色器程序 运行效果 源码下载 前言 凹凸贴图的一种替代方法是使用查找表来替换法向量.这样 ...
- OpenGL 法线贴图Normal Mapping
OpenGL法线贴图Normal Mapping 法线贴图Normal Mapping简介 法线贴图 切线空间 手工计算切线和副切线 切线空间法线贴图 复杂物体 最后一件事 法线贴图Normal Ma ...
- 【视觉高级篇】25 # 如何用法线贴图模拟真实物体表面
说明 [跟月影学可视化]学习笔记. 什么是法线贴图? 法线贴图就是在原物体的凹凸表面的每个点上均作法线,通过RGB颜色通道来标记法线的方向,你可以把它理解成与原凹凸表面平行的另一个不同的表面,但实际上 ...
- OpenGL 法线贴图 切线空间 整理
1. What`s Bump Mapping? Bump Mapping通过改变几何体表面各点的法线,使本来是平的东西看起来有凹凸的效果,是一种欺骗眼睛的技术:). 我们知道,如果几何体表面有高低不平 ...
- shader graph_在Shader Graph中使用表面梯度框架进行法线贴图合成
shader graph A recent Unity Labs paper introduces a new framework for blending normal maps that is e ...
- 技术美术知识学习_06:关于法线贴图详解
一.什么是法线贴图 法线贴图说明: 法线贴图就是在原物体的凹凸表面的每个点上均作法线,通过RGB颜色通道来标记法线的方向,你可以把它理解成与原凹凸表面平行的另一个不同的表面,但实际上它又只是一个光滑的 ...
- Unity Shader法线贴图(Normal Map)及其原理
简介 以前经常听说"模型不好看啊,怎么办啊?"答曰"加法线","做了个高模,准备烘一下法线贴图","有的美术特别屌,直接画法线贴图 ...
- 法线贴图Nomal mapping 原理
法线贴图多用在CG动画的渲染以及游戏画面的制作上,将具有高细节的模型通过映射烘焙出法线贴图,贴在低端模型的法线贴图通道上,使之拥有法线贴图的渲染效果,却可以大大降低渲染时需要的面数和计算内容,从而达到 ...
- shader 获取法线_Unity Shader 入门到改行5——法线贴图
the best of blur 1. 法线贴图理论 1.1 什么是法线贴图 一般的贴图中存储的是表面颜色值(RGBA),而法线贴图存放的则是法线信息(xyzw),假设某顶点处的 uv 坐标为 (u, ...
最新文章
- NIPS论文排行榜出炉,南大周志华5篇论文入选
- android天女散花效果_Android有趣的爆炸散落动画view:开源ExplosionField
- 前端将二进制数据流转为文件_前端通过二进制流下载文件
- linux 下载mysql5.7.22
- 《学习CSS布局》学习笔记
- java 一个线程运行_Java并发(基础知识)—— 创建、运行以及停止一个线程
- python能和java一起编程吗_C如何能和Python一起编程,那么它们已经无敌了!Java靠边站!...
- calendar控件使用 extjs_extjs年月选择日历及通用js同步ajax调用返回json object
- 网吧无盘服务器主机 系统,一个网吧无盘系统的安装步骤(新手教程)
- Windows Server 2008 R2 免费使用900天的方法
- 广东诚美计算机专修学院面试,三下乡|一轮面试,与你不期而遇
- MariaDB—— 14.存储引擎
- Chrome浏览器升级80以后导致重定向自动登录失效问题记录和解决方案
- 计算机四级数据库分值分布,英语四级的题型及分值分布
- 如何解决农村产权交易难的问题
- 【回眸】有显示器如何设置串口登录树莓派4B
- 关闭Windows系统的应用程序或窗口的快捷键有哪些?
- h5案例分享 京东:有爱圣诞 无限京喜
- 厉害了,大学生制作的学校三维实景模型
- 【JavaScript打印100,1000,10000 ......内的素数】自动打印素数
热门文章
- 2016.5.57—— Remove Duplicates from Sorted List
- Linux 下zip包的压缩与解压
- [生物] - 怎样理解细胞分裂次数是有限制的
- python详细下载安装教程-Pycharm及python安装详细教程
- 上海找python工作-python上海招聘
- python手机版iphone-只会Python可造不出iPhone
- python代码块-python代码块
- 0基础学python-看完这篇,零基础也知道怎么学Python
- python面试题及答案-50道Python面试题集锦(附答案)
- 如何在电脑上使用python-如何在Windows上使用Python进行开发