当前位置: 首页 > news >正文

OpenGL 法线

法线是垂直于物体表面的“方向箭头”,用来告诉计算机这个面朝哪边,从而计算光照、阴影、反射等效果

一. 定义

  • 几何定义:法线是一个单位向量(长度为1的箭头),垂直于物体表面

    • 平面:所有点的法线方向相同

    • 曲面:每个点的法线方向不同(如球体)

  • 在计算机图形学中:法线通常用 (x, y, z) 三个数值表示,范围在 [-1, 1]

二. OpenGL 法线用途

法线的主要作用是告诉光照系统“表面朝哪边”,从而影响视觉效果

1. 计算光照(明暗)
  • 原理:光线照射到表面时,入射角(光线与法线的夹角)决定亮度

    • 法线朝向光源 → 更亮(如 dot(N, L) = 1

    • 法线背对光源 → 更暗(如 dot(N, L) = -1

  • 示例

    float brightness = dot(normal, lightDirection); // 计算光照强度
2. 实现阴影和立体感
  • 没有法线:物体看起来像平面(如纸片)。

  • 有法线:物体看起来有体积感(如球体)。

3. 反射和环境光
  • 法线决定反射光的方向(如镜面高光、环境光遮蔽)。

4. 法线贴图(伪造细节)
  • 用法线贴图修改表面朝向,让低模看起来有凹凸细节(如砖墙、锈迹)。

三. 法线的类型

1. 顶点法线(Vertex Normal)
  • 每个顶点有一个法线,用于平滑曲面(如球体)

  • 计算方式:相邻面的法线平均值

2. 面法线(Face Normal)
  • 每个三角形面有一个法线(所有顶点共享同一个法线)

  • 适用于硬表面(如立方体)

3. 切线空间法线(Tangent-Space Normal)
  • 用于法线贴图,存储相对于模型表面的局部方向

四. 代码示例

1. 顶点着色器传递法线
#version 330 core
layout (location = 0) in vec3 aPos;    // 顶点位置
layout (location = 1) in vec3 aNormal; // 顶点法线out vec3 Normal; // 传递给片段着色器void main() {gl_Position = projection * view * model * vec4(aPos, 1.0);Normal = mat3(transpose(inverse(model))) * aNormal; // 修正法线(考虑模型变换)
}
2. 片段着色器计算光照
#version 330 core
in vec3 Normal;
out vec4 FragColor;uniform vec3 lightDir; // 光源方向(归一化)void main() {float diff = max(dot(Normal, lightDir), 0.0); // 漫反射强度vec3 color = diff * vec3(1.0, 0.0, 0.0);     // 红色 + 光照FragColor = vec4(color, 1.0);
}
http://www.lryc.cn/news/625502.html

相关文章:

  • 【群晖NAS】在openwrt上实现内网穿透,并配置外网IP映射(Debian/Ubuntu)
  • 使用 Resilience4j 实现 Spring Boot 服务限流:轻量级容错的最佳实践
  • 基于单片机身体健康监测/身体参数测量/心率血氧血压
  • Linux 进程间通信(IPC):信号、共享内存
  • 基于Java(SSM框架)+MySQL实现(Web)的超市管理系统
  • 2025.8.19总结
  • Python 函数进阶:深入理解参数、装饰器与函数式编程
  • 服务器Linux防火墙怎样实现访问控制
  • AAA服务器技术
  • 【实时Linux实战系列】基于实时Linux的智能工业机器人开发
  • 通过分布式系统的视角看Kafka
  • Lua学习记录 - 自定义模块管理器
  • 机械设备制造行业物联网智能化升级改造方案
  • 【habitat学习一】Habitat-Lab 配置键文档详解(CONFIG_KEYS.md)
  • 前端多环境变量配置全攻略:开发 / 测试 / 生产自动切换实战
  • APM32芯得 EP.29 | 基于APM32F103的USB键盘与虚拟串口复合设备配置详解
  • 清空 github 仓库的历史提交记录(创建新分支)
  • HUD抬头显示器太阳光模拟器设备用于杂散光测试介绍
  • 第4章 React状态管理基础
  • 【SpringBoot】Dubbo、Zookeeper
  • QT之QWaitCondition降低cpu占用率,从忙等待到高效同步
  • Qt——文件操作
  • Qt原对象系统工作机制
  • 基于 PyTorch 模型训练优化、FastAPI 跨域配置与 Vue 响应式交互的手写数字识别
  • SpreadJS 协同服务器 MongoDB 数据库适配支持
  • JavaSSM框架从入门到精通!第二天(MyBatis(一))!
  • EasyExcel 合并单元格最佳实践:基于注解的自动合并与样式控制
  • AI硬件英伟达选购的建议。
  • SSH 使用密钥登录服务器
  • 服务器无公网ip如何对外提供服务?本地网络只有内网IP,如何能被外网访问?