用三维模型的顶点法向量计算法线贴图

 

        法线贴图的核心概念是在不增加额外多边形数目的情况下,通过模拟细节来改善光照效果。具体流程包括:

  1. 法线的计算与存储:通过法线映射将三维法线向量转化为法线贴图的 RGB 值。
  2. 渲染中的使用:在片段着色器中使用法线贴图来替代原有的法线向量,进行光照计算。法线贴图通过模拟表面的细节,提升最终渲染的真实感。

        在法线贴图的实现中,需要将模型的三维法线信息转化为二维纹理(法线贴图)。不过,法线贴图通常是在纹理空间(2D 图像的每个像素)内进行操作,并不直接操作三维顶点的法线,而是利用法线贴图中的每个像素值表示一个表面的法向量。

法线贴图的核心原理

        法线贴图通常以 RGB 颜色存储法线信息,其中:

  • R(红色通道) 代表法线的 X 方向
  • G(绿色通道) 代表法线的 Y 方向
  • B(蓝色通道) 代表法线的 Z 方向

        这些 RGB 值通常经过归一化处理,确保其表示的法线是单位向量。法线贴图的 RGB 值范围通常是 [0, 1],但它们在纹理贴图中表示的是法线在三维空间中的偏移量。

法线贴图的流程

  1. 计算和创建法线贴图
    • 为每个顶点计算法线,并将其转化为法线贴图的 RGB 值。
    • 在3D建模软件(如 Blender)中,通常会将模型的法线信息烘焙到法线贴图上。烘焙过程会计算每个像素的法线,并把它们存储为 RGB 值。
  2. 使用法线贴图在渲染中替代原始法线
    • 在渲染时,顶点的原始法线不再用于光照计算,而是使用法线贴图中的法线(经过纹理坐标映射到模型表面的每个像素)。
    • 法线贴图中的 RGB 值将通过着色器计算得到一个新的法线向量,该法线向量与光照计算结合,影响最终的渲染效果。

法线贴图计算的步骤和代码

1. 计算法线贴图中的法线

        在模型的每个三角形上,根据顶点法线生成法线贴图。假设已经有了一个网格模型,并且每个顶点都有法线向量。

  1. 将法线向量转换为 RGB 值(该过程通常在法线贴图烘焙时由工具自动完成):

    • 需要将三维法线向量映射到 RGB 颜色空间。
    • 法线向量的 x, y, z 分别映射到 R, G, B 通道,通常通过以下公式转换:

    其中,Nx, Ny, Nz 是法线向量的三个分量,范围是 [-1, 1],通过上述公式映射到 [0, 1] 范围内的 RGB 值。

  2. 法线贴图在纹理中的存储方式:

    • 例如,对于一个法线 (Nx, Ny, Nz),其对应的 RGB 值可以是:
      • R = (Nx + 1) / 2
      • G = (Ny + 1) / 2
      • B = (Nz + 1) / 2
2. 在渲染时使用法线贴图

        在渲染时,法线贴图中的 RGB 值会被用来替代顶点的法线,计算最终的光照效果。

        假设已经加载了法线贴图,并且传递给片段着色器,在着色器中,我们将法线贴图的 RGB 值重新映射为三维法线向量,进行光照计算。

顶点着色器(Vertex Shader)
#version 330 core
layout (location = 0) in vec3 aPos;       // 顶点位置
layout (location = 1) in vec3 aNormal;    // 顶点法向量
layout (location = 2) in vec2 aTexCoords; // 纹理坐标out vec2 TexCoords; // 输出纹理坐标给片段着色器uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;void main() {// 计算最终的顶点位置gl_Position = projection * view * model * vec4(aPos, 1.0);TexCoords = aTexCoords; // 将纹理坐标传递给片段着色器
}

片段着色器(Fragment Shader)

  1. 将法线从纹理映射到表面:在片段着色器中,normal 会从法线贴图中获取,经过映射后重新生成一个单位法线,代表表面的局部法向量。

  2. 光照计算:使用这个法线计算漫反射光照和高光,得到最终的表面颜色。由于法线是通过法线贴图获取的,表面看起来会有更丰富的细节,即使原始网格本身非常简单。

#version 330 core
out vec4 FragColor;in vec2 TexCoords; // 从顶点着色器传递的纹理坐标uniform sampler2D texture1; // 法线贴图纹理
uniform vec3 lightPos; // 光源位置
uniform vec3 viewPos;  // 观察者(相机)位置void main() {// 从法线贴图中读取 RGB 法线值vec3 normal = texture(texture1, TexCoords).rgb;normal = normalize(normal * 2.0 - 1.0); // 映射到 [-1, 1] 范围// 简单的光照计算:漫反射 + 视角方向vec3 lightDir = normalize(lightPos - FragCoord.xyz); // 光源方向float diff = max(dot(normal, lightDir), 0.0); // 漫反射光照vec3 viewDir = normalize(viewPos - FragCoord.xyz); // 视线方向vec3 reflectDir = reflect(-lightDir, normal); // 反射方向float spec = pow(max(dot(viewDir, reflectDir), 0.0), 32); // 高光计算// 颜色输出:光照与法线贴图相结合FragColor = vec4(diff + spec, diff + spec, diff + spec, 1.0);
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hadoop分布式文件系统(二)

目录 1. 引言1. Hadoop文件操作命令2. 部分常用的Hadoop FS Shell命令2.1 ls列出文件2.2 mkdir创建目录2.3 put上传文件2.4 cat查看文件2.5 get复制文件2.6 rm删除文件 3. Hadoop系统管理命令4. HDFS Java API 示例参考 1. 引言 大多数HDFS Shell命令的行为和对应的Unix Shell命…

ESP32-S3模组上跑通ES8388(13)

接前一篇文章:ESP32-S3模组上跑通ES8388(12) 二、利用ESP-ADF操作ES8388 2. 详细解析 上一回解析了es8388_init函数中的第6段代码,本回继续往下解析。为了便于理解和回顾,再次贴出es8388_init函数源码,在…

LearnOpenGL学习(光照 -- 颜色,基础光照,材质,光照贴图)

光照 glm::vec3 lightColor(0.0f, 1.0f, 0.0f); glm::vec3 toyColor(1.0f, 0.5f, 0.31f); glm::vec3 result lightColor * toyColor; // (0.0f, 0.5f, 0.0f); 说明:当我们把光源的颜色与物体的颜色值相乘,所得到的就是这个物体所反射的颜色。 创建…

Linux条件变量线程池详解

一、条件变量 【互斥量】解决了线程间同步的问题,避免了多线程对同一块临界资源访问产生的冲突,但同一时刻对临界资源的访问,不论是生产者还是消费者,都需要竞争互斥锁,由此也带来了竞争的问题。即生产者和消费者、消费…

Figma入门-自动布局

Figma入门-自动布局 前言 在之前的工作中,大家的原型图都是使用 Axure 制作的,印象中 Figma 一直是个专业设计软件。 最近,很多产品朋友告诉我,很多原型图都开始用Figma制作了,并且很多组件都是内置的,对…

威联通-001 手机相册备份

文章目录 前言1.Qfile Pro2.Qsync Pro总结 前言 威联通有两种数据备份手段:1.Qfile Pro和2.Qsync Pro,实践使用中存在一些区别,针对不同备份环境选择是不同。 1.Qfile Pro 用来备份制定目录内容的。 2.Qsync Pro 主要用来查看和操作文…

大R玩家流失预测在休闲社交游戏中的应用

摘要 预测玩家何时会离开游戏为延长玩家生命周期和增加收入贡献创造了独特的机会。玩家可以被激励留下来,战略性地与公司组合中的其他游戏交叉链接,或者作为最后的手段,通过游戏内广告传递给其他公司。本文重点预测休闲社交游戏中高价值玩家…

基于Java Springboot宠物咖微信小程序

一、作品包含 源码数据库全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 微信开发者工具 数…

ultralytics-YOLOv11的目标检测解析

1. Python的调用 from ultralytics import YOLO import os def detect_predict():model YOLO(../weights/yolo11n.pt)print(model)results model(../ultralytics/assets/bus.jpg)if not os.path.exists(results[0].save_dir):os.makedirs(results[0].save_dir)for result in…

蓝桥杯准备训练(lesson1,c++方向)

前言 报名参加了蓝桥杯(c)方向的宝子们,今天我将与大家一起努力参赛,后序会与大家分享我的学习情况,我将从最基础的内容开始学习,带大家打好基础,在每节课后都会有练习题,刚开始的练…

vscode 如何支持点击跳转函数,以C++为例,Python等其它编程语言同理,Visual Studio Code。

VScode(Visual Studio Code)按住Ctrl鼠标左键,没法跳转到对应的函数怎么办。 如下图所示 1、点击有四个小方块的图标 2、输入C(如果你的编程语言是C,其它的就输其它的) 3、找到C Extension(其它编程语言&#xff0…

【包教包会】CocosCreator3.x——重写Sprite,圆角、3D翻转、纹理循环、可合批调色板、不影响子节点的位移旋转缩放透明度

一、效果演示 重写Sprite组件,做了以下优化: 1、新增自变换,在不影响子节点的前提下位移、旋转、缩放、改变透明度 新增可合批调色板,支持色相、明暗调节 新增圆角矩形、3D透视旋转、纹理循环 所有功能均支持合批、原生平台&…

Java八股文(11-29start)

p1 缓存预热也要预热到布隆过滤器.过滤不存在的数据 布隆过滤器需要存储 添加数据的时候进行预热.布隆过滤器里面是位图结构,通过多个hash函数获得下标.改为1. 查询 id进行查询获得对应下标是否为1.可能会出现误判. 判断id是否存在. 穿透就是查询一个不存在的id.一直查询数…

【Gitlab】gitrunner并发配置

并发介绍 涉及到并发控制的一共有4个参数: concurrent , limit ,request_concurrency,parallel 全局的配置: [rootiZ2vc6igbukkxw6rbl64ljZ config]# vi config.toml concurrent 4 #这是一个总的全局控制,它限制了所有pipline,所有runner执行器…

智能运维在配电所设备监控中的应用与洞察

在配电所的设备监控中,智能运维正发挥着越来越重要的作用。通过对配电所内各关键设备的实时监测和数据分析,智能运维系统不仅提高了运维效率,还为我们提供了更深入的设备运行洞察。 一、设备监控概况 配电所内设有多个监测点,包括…

Lumos学习王佩丰Excel第十九讲:Indirect函数

一、认识indirect单元格引用 1、了解Indirect函数的意义及语法 Indirect:引用函数,间接引用。 函数语法:INDIRECT(ref_text,[a1]) 其中,ref_text是一个表示单元格地址或名称的字符串,a1是一个可选的逻辑值参数&…

QT6学习第八天 QFrame 类

QT6学习第八天 QFrame 类族QLabel 标签部件按钮部件QLineEdit 行编辑器部件QAbstractSpinBoxQAbstractSlider 今天来学一学 QFrame 类。 QFrame 类族 QFrame 类是带有边框的部件的基类。它的子类包括常用的标签部件 QLabel、以及 QLCDNumber、QSplitter、QStackedWidget、QToo…

Nginx学习-安装以及基本的使用

一、背景 Nginx是一个很强大的高性能Web和反向代理服务,也是一种轻量级的Web服务器,可以作为独立的服务器部署网站,应用非常广泛,特别是现在前后端分离的情况下。而在开发过程中,我们常常需要在window系统下使用Nginx…

【AI系统】Ascend C 语法扩展

Ascend C 语法扩展 Ascend C 的本质构成其实是标准 C加上一组扩展的语法和 API。本文首先对 Ascend C 的基础语法扩展进行简要介绍,随后讨论 Ascend C 的两种 API——基础 API 和高阶 API。 接下来针对 Ascend C 的几种关键编程对象——数据存储、任务间通信与同步…

java将word docx pdf转换为图片(不需要额外下载压缩包,直接导入maven坐标)

(本代码实现的是将第1页转为图片,主要用于制作文件缩略图) pdf转图片容易 docx转图片麻烦,看其他博客可以直接导入maven坐标,但我知道那是需要付费且有时限的包 本着简单实用的心,我找到法子了 pdf转图片:有库直接转…