[OpenGL] 法线贴图

news2024/11/17 15:51:26

目录

一 为什么要使用法线贴图

二 二种不同法线方式的使用

2.1 插值法线

2.1 法线贴图


本章节源码 点击此处

一 为什么要使用法线贴图

法线贴图我们可以使用更少的顶点表现出同样丰富的细节。高精度网格和使用法线贴图的低精度网格几乎区分不出来。所以法线贴图不仅看起来漂亮,它也是一个将高精度多边形转换为低精度多边形而不失细节的重要工具。

我们知道不是所有的物体表面都是光滑平整的平面,比如我么要绘制一个人脸,但人脸会由,头发,五官,甚至是微表情等组成这些都是具有凹凸感的,那我们该如何体现出这种凹凸感呢?

  • 第一种方式: 传入大量的顶点坐标,让大量的顶点来帮我们实现人脸中的各个细节。但这无疑是会增大额外的开销。
  • 第二种方式: 我们使用法线贴图,来为每个像素上都设置不同的法线值,这样实现的效果和大量的顶点坐标几乎一样。

如下图所示: 左边第一个是传入了上百万的顶点坐标实现的效果,而最中间的是传入了500个顶点实现的效果,最后一个是在中间的基础上运用的法线贴图实现的效果,他们的效果几乎是一样的。

二 二种不同法线方式的使用

  • 通俗的理解法线的作用是在计算光照时根据角度的不同,反映在颜色上的变化,比如如果法线与光线垂直那么就会光照效果最大,颜色最亮。
  • 一般有两种不同方式来传递给GPU法线,一种是采样插值法线,也就是为每个顶点传递它的法线,另一种是采用法线贴图

2.1 插值法线

  • 观察下面这个图我们是使用插值法线得到的效果,我们传入的是6个顶点也就是2个三角形,而这6个顶点位于同一个平面,我们使用插值法线一般也是会插入6个法线向量,但同一个平面我们此时传入的法线其实是相同的,那会造成什么问题呢?
  • 例如,砖块的表面。砖块的表面非常粗糙,显然不是完全平坦的:它包含着接缝处水泥凹痕,以及非常多的细小的空洞。如果我们在一个有光的场景中看这样一个砖块的表面,问题就出来了。下图中我们可以看到砖块纹理应用到了平坦的表面,我们并看不到砖缝以及砖块表面的一些细节或者说不是很明显。

  • 对于插值法线,同一个片段上我们可以理解为法线是相同的,以光的视角来说,这个表面就是完全平坦的,即使本身提供的纹理图片上可能会看到一些砖缝但这并不能完全体现出这种凹凸不平的平面的细节。
  • 我们可以使用一种技术,让每个顶点拥有自己单独的法线,当光源照射到顶点时,根据法线的不同就能体现出更过的细节。替代一个面上所有fragment使用同一个法线的技术叫做法线贴图(normal mapping)或凹凸贴图(bump mapping)

2.1 法线贴图

原理

  • 在使用法线贴图前我们应该了解一下法线贴图的原理。其实就是用一个2D的纹理来保存每个片段的法线.
  • 纹理中的rgb就刚好对应了法线的xyz坐标
  • 这也就是我们为什么看到下面这个纹理大部分是蓝色,而在砖缝中表现的偏绿色,是因为这个纹理贴图大部分是指向z轴的也就是rgb中的b(蓝色),而砖缝中就偏向于绿色也就是指向y轴。

  • 这里有个值得注意的点,纹理中的像素颜色是0-1之间的,我们需要把它转换到标准坐标中的-1-1之间。
        vec3 normTemp = vec3(texture(texture_normal1,TexCoords));
        norm = normalize(normTemp * 2.0 -1.0);
  • 这样我们在片段着色器中,就能够获取到每个片段上对于的法线值了(其实就是纹理颜色值)。

效果:

  • 这样我们就能看到这个墙壁的诸多细节了。

三 代码开关

  • 在源码中我们使用一个开关bIsTexture,当我们点击dockwidgt中的插值法线时,该值为false,则采用默认的插值法线来计算,如果点击法线贴图改值为true,采用法线贴图来渲染

 vec3 norm;
    if(bIsTexture == true)
    {
        vec3 normTemp = vec3(texture(texture_normal1,TexCoords));
        norm = normalize(normTemp * 2.0 -1.0);
    }else
    {
        norm = normalize(Normal);
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1692849.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从ES到ClickHouse,Bonree ONE平台更轻更快!

本文字数:8052;估计阅读时间:21 分钟 作者:博睿数据 李骅宸(太道)& 娄志强(冬青) 本文在公众号【ClickHouseInc】首发 本系列第一篇内容: 100%降本增效!…

windows安装kafka环境

1.安装jdk8 参考教程java8安装教程_java8u371安装教程-CSDN博客 下载kafak安装包: kafka_2.12-3.6.1.tgz 解压: 启动ZooKeeper软件,kafka内部已近集成了该软件。 进入Kafka解压缩文件夹的config目录,修改zookeeper.properti…

SpringCloud系列(22)--Ribbon默认负载轮询算法原理及源码解析

前言:在上一篇文章中我们介绍了如何去切换Ribbon的负载均衡模式,而本章节内容则是介绍Ribbon默认负载轮询算法的原理。 1、负载轮询算法公式 rest接口第N次请求数 % 服务器集群总数 实际调用服务器下标(每次服务器重启后rest接口计数从1开始…

HTML静态网页成品作业(HTML+CSS)——动漫海绵宝宝介绍网页(5个页面)

🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有5个页面。 二、作品演示 三、代…

外卖小程序开发指南:从源码开始构建高效的外卖平台

今天,笔者将为您详细讲解如何从源码开始构建一个高效的外卖小程序,帮助您快速进入这一蓬勃发展的市场。 一、需求分析与设计 需求分析包括: 1.用户需求 2.市场需求 3.技术需求 二、前端开发 以下是开发步骤: -使用微信开发…

听说部门来了个00后测试开发,一顿操作给我整麻了

公司新来了个同事,听说大学是学的广告专业,因为喜欢IT行业就找了个培训班,后来在一家小公司实习半年,现在跳槽来我们公司。来了之后把现有项目的性能优化了一遍,服务器缩减一半,性能反而提升4倍&#xff01…

labelme的使用

创建虚拟环境 听说是要用这个3.6版本的python环境 conda create --namelabelme python3.6激活虚拟环境 activate labelme下载labelme pip install labelme #安装labelme组件启动labelme 在你打开文件的时候推荐还是自己先建立一个label.txt 把自己要分的类别放进去 label.…

【CSP CCF】202104-2 邻域均值

题目 过程 前缀和 定义 假定一个数组,前缀和就是该元素前所有元素和。也就是如果我们舌钉一个数组s为前缀和数组,那么s[3]就是我们原数组前三个元素之和。 优势 降低计算复杂度。 如果我们要求一段区间的和,那么我们用普通数组要从第一…

Linux驱动开发笔记(二) 基于字符设备驱动的I/O操作

文章目录 前言一、设备驱动的作用与本质1. 驱动的作用2. 有无操作系统的区别 二、内存管理单元MMU三、相关函数1. ioremap( )2. iounmap( )3. class_create( )4. class_destroy( ) 四、GPIO的基本知识1. GPIO的寄存器进行读写操作流程2. 引脚复用2. 定义GPIO寄存器物理地址 五、…

一个 Go 实现的跨平台 GUI 框架 Fyne

今天,推荐一个 Go 实现的 GUI 库 - fyne。 Go 官方也没有提供标准的 GUI 框架,在 Go 实现的几个 GUI 库中,Fyne 算是最出色的,它有着简洁的API、支持跨平台能力,且高度可扩展。这也就是说,Fyne 是可以开发…

如果直升机一直在空中悬停,24小时后能否绕行地球一圈?

直升机悬停在空中,似乎给了我们一种静止的错觉。但如果直升机一直保持这种状态,24小时后,它是否能够神奇地绕地球一圈? 地球自转:直升机悬停的无形锁链 问题的答案并非像表面上看起来那样简单。要解答这个问题&#…

Win10玩红警黑屏有声音的解决方法

Win10玩红警黑屏怎么解决?红色警戒,可以说是一款深受青少年朋友喜爱的网游,但是,当我们在使用win10电脑运行红色警戒的时候免不了会出现不兼容、权限不足等问题。相信玩过红警的小伙伴都有遇到过黑屏的问题,那该怎么解…

弱密码系统登录之后强制修改密码

在你登录的时候,获取到弱密码,然后将他存到vuex里面,在登录进去之后,index页面再去取,思路是这样的 一、vuex里面定义密码字段 我是直接在user.js里面写的 import { login, logout, getInfo } from /api/login impo…

SQLmap学习以及题解运用

1.简介 SQLmap是一款开源的SQL注入工具,用于检测和利用Web应用程序的SQL注入漏洞。SQLmap支持多种数据库管理系统,包括MySQL、Oracle、PostgreSQL、Microsoft SQL Server、SQLite等,并支持各种不同的操作系统和平台。 这里主要分为四大部分…

计网(部分在session学习章)

TCP/UDP TCP:面向连接,先三次握手建立连接,可靠传输。 UDP:无连接,不可靠,传递的快。 TCP可靠传输 1.分块编号传输; 2.校验和,校验首部和数据的检验和,检测数据在传输中的变化; 3.丢弃重复数据; 4.流量控制,TCP 利⽤滑动窗⼝实现流量控制。TCP的拥塞控制采⽤…

一年前的Java作业,模拟游戏玩家战斗

说明:一年前写的作业,感觉挺有意思的,将源码分享给大家。 刚开始看题也觉得很难,不过写着写着思路更加清晰,发现也没有想象中的那么难。 一、作业题目描述: 题目:模拟游戏玩家战斗 1.1 基础功…

台灯的功能作用有哪些?护眼台灯真的护眼吗?

现在的学生会长时间使用平板、手机、电脑等,这些设备的屏幕会产生一定的频闪和蓝光辐射,也就会影响视力健康,而护眼养眼也成了家长关注的问题,视力疲劳和眼部疾病不仅影响个体的生活质量,还可能导致长期的健康问题。当…

IPIDEA与您分享:代理IP究竟是如何保护用户隐私的?

在信息化、网络化的今天,互联网已成为人们生活中不可或缺的一部分。无论是日常沟通、学习工作,还是娱乐休闲,网络都扮演着举足轻重的角色。然而,随着网络活动的增加,网络安全问题也日益凸显,为了保护个人隐…

Mybatis源码剖析---第二讲

Mybatis源码剖析—第二讲 那我们在讲完了mappedstatement这个类,它的一个核心作用之后呢?那下面我有一个问题想问问各位。作为mappedstatement来讲,它封装的是一个select标签或者insert标签。但是呢,我们需要大家注意的是什么&am…

LeetCode --- 398周赛

题目列表 3151. 特殊数组 I 3152. 特殊数组 II 3153. 所有数对中数位不同之和 3154. 到达第 K 级台阶的方案数 一、特殊数组I 遍历数组&#xff0c;看相邻元素的奇偶性是否相同即可&#xff0c;代码如下 class Solution { public:bool isArraySpecial(vector<int>&…