低版本 vertex shader 可以使用,通常用来反转TBN矩阵,但是计算量很大。

代码来自 OpenGL Mathematics (GLM)

mat4 inverse_mat4(mat4 m)
{
float Coef00 = m[][] * m[][] - m[][] * m[][];
float Coef02 = m[][] * m[][] - m[][] * m[][];
float Coef03 = m[][] * m[][] - m[][] * m[][]; float Coef04 = m[][] * m[][] - m[][] * m[][];
float Coef06 = m[][] * m[][] - m[][] * m[][];
float Coef07 = m[][] * m[][] - m[][] * m[][]; float Coef08 = m[][] * m[][] - m[][] * m[][];
float Coef10 = m[][] * m[][] - m[][] * m[][];
float Coef11 = m[][] * m[][] - m[][] * m[][]; float Coef12 = m[][] * m[][] - m[][] * m[][];
float Coef14 = m[][] * m[][] - m[][] * m[][];
float Coef15 = m[][] * m[][] - m[][] * m[][]; float Coef16 = m[][] * m[][] - m[][] * m[][];
float Coef18 = m[][] * m[][] - m[][] * m[][];
float Coef19 = m[][] * m[][] - m[][] * m[][]; float Coef20 = m[][] * m[][] - m[][] * m[][];
float Coef22 = m[][] * m[][] - m[][] * m[][];
float Coef23 = m[][] * m[][] - m[][] * m[][]; const vec4 SignA = vec4( 1.0, -1.0, 1.0, -1.0);
const vec4 SignB = vec4(-1.0, 1.0, -1.0, 1.0); vec4 Fac0 = vec4(Coef00, Coef00, Coef02, Coef03);
vec4 Fac1 = vec4(Coef04, Coef04, Coef06, Coef07);
vec4 Fac2 = vec4(Coef08, Coef08, Coef10, Coef11);
vec4 Fac3 = vec4(Coef12, Coef12, Coef14, Coef15);
vec4 Fac4 = vec4(Coef16, Coef16, Coef18, Coef19);
vec4 Fac5 = vec4(Coef20, Coef20, Coef22, Coef23); vec4 Vec0 = vec4(m[][], m[][], m[][], m[][]);
vec4 Vec1 = vec4(m[][], m[][], m[][], m[][]);
vec4 Vec2 = vec4(m[][], m[][], m[][], m[][]);
vec4 Vec3 = vec4(m[][], m[][], m[][], m[][]); vec4 Inv0 = SignA * (Vec1 * Fac0 - Vec2 * Fac1 + Vec3 * Fac2);
vec4 Inv1 = SignB * (Vec0 * Fac0 - Vec2 * Fac3 + Vec3 * Fac4);
vec4 Inv2 = SignA * (Vec0 * Fac1 - Vec1 * Fac3 + Vec3 * Fac5);
vec4 Inv3 = SignB * (Vec0 * Fac2 - Vec1 * Fac4 + Vec2 * Fac5); mat4 Inverse = mat4(Inv0, Inv1, Inv2, Inv3); vec4 Row0 = vec4(Inverse[][], Inverse[][], Inverse[][], Inverse[][]); float Determinant = dot(m[], Row0); Inverse /= Determinant; return Inverse;
}
mat3 inverse_mat3(mat3 m)
{
float Determinant =
m[][] * (m[][] * m[][] - m[][] * m[][])
- m[][] * (m[][] * m[][] - m[][] * m[][])
+ m[][] * (m[][] * m[][] - m[][] * m[][]); mat3 Inverse;
Inverse[][] = + (m[][] * m[][] - m[][] * m[][]);
Inverse[][] = - (m[][] * m[][] - m[][] * m[][]);
Inverse[][] = + (m[][] * m[][] - m[][] * m[][]);
Inverse[][] = - (m[][] * m[][] - m[][] * m[][]);
Inverse[][] = + (m[][] * m[][] - m[][] * m[][]);
Inverse[][] = - (m[][] * m[][] - m[][] * m[][]);
Inverse[][] = + (m[][] * m[][] - m[][] * m[][]);
Inverse[][] = - (m[][] * m[][] - m[][] * m[][]);
Inverse[][] = + (m[][] * m[][] - m[][] * m[][]);
Inverse /= Determinant; return Inverse;
}

GLSL反转矩阵inverse的更多相关文章

  1. 控制反转(IOC: Inverse Of Control) & 依赖注入(DI: Independence Inject)

    举例:在每天的日常生活中,我们离不开水,电,气.在城市化之前,我们每家每户需要自己去搞定这些东西:自己挖水井取水,自己点煤油灯照明,自己上山砍柴做饭.而城市化之后,人们从这些琐事中解放了出来,城市中出 ...

  2. C# 控制反转(IOC: Inverse Of Control) & 依赖注入(DI: Independence Inject)

    举例:在每天的日常生活中,我们离不开水,电,气.在城市化之前,我们每家每户需要自己去搞定这些东西:自己挖水井取水,自己点煤油灯照明,自己上山砍柴做饭.而城市化之后,人们从这些琐事中解放了出来,城市中出 ...

  3. 图片变换【Matrix】矩阵 简介

    Matrix矩阵介绍 官方文档地址:https://developer.android.com/reference/android/graphics/Matrix.html 在Android中,对图片 ...

  4. 06章 映射一对多双向关联关系、以及cascade、inverse属性

    当类与类之间建立了关联,就可以方便的从一个对象导航到另一个对象.或者通过集合导航到一组对象.例如: 对于给定的Emp对象,如果想获得与它关联的Dept对象,只要调用如下方法 Dept dept=emp ...

  5. Spring控制反转与依赖注入(IOC、DI)

    IOC: 反转控制   Inverse Of Control DI:依赖注入 Dependency Injection 目的:完成程序的解耦合 解释:在应用系统的开发过程中,有spring负责对象的创 ...

  6. 映射一对多双向关联关系 cascade、inverse、属性

    当类与类之间建立了关联,就可以方便的从一个对象导航到另一个对象.或者通过集合导航到一组对象.例如: 对于给定的Emp对象,如果想获得与它关联的Dept对象,只要调用如下方法 Dept dept=emp ...

  7. Inverse属性和cascade属性以及集合的多对多关系

    Inverse属性 Inverse属性,是在维护关联关系的时候起作用的. 表示控制权是否转移.(在一的一方起作用) Inverse = true, 控制反转. Inverse = false  不反转 ...

  8. Hibernate框架--关联映射,一对多,多对多 inverse cascade

    回顾Hibernate: 1. hibernate开发环境搭建 ----> 引入jar: hibernate.jar + required + jpa + 驱动包 ---> hiberna ...

  9. Hibernate 集合映射 一对多多对一 inverse属性 + cascade级联属性 多对多 一对一 关系映射

    1 . 集合映射 需求:购物商城,用户有多个地址. // javabean设计 // javabean设计 public class User { private int userId; privat ...

随机推荐

  1. yaml中的锚点和引用

    项目引入yaml语言来写配置文件,最近发现利用其锚点&和引用*的功能,可以极大减少配置文件中的重复内容,将相同配置内容收敛到锚点处,修改时,只需要修改锚点处的内容,即可在所有引用处生效. ya ...

  2. AWVS11提取规则文件

    在这里给大家分享一个获取AWVS规则文件的思路.  目前我提取的是17年4月份的扫描规则.   后面如果规则更新,可以自行提取 官网:   https://www.acunetix.com/vulne ...

  3. Linux 防火墙设置(转)

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...

  4. sklearn中的交叉验证(Cross-Validation)

    这个repo 用来记录一些python技巧.书籍.学习链接等,欢迎stargithub地址sklearn是利用python进行机器学习中一个非常全面和好用的第三方库,用过的都说好.今天主要记录一下sk ...

  5. .NET导出Excel之NPOI

    前段时间研究过微软的Excel导出.table输出Excel,而它们也存在一些弊端: 1.对于微软的Excel导出存在一些弊端,如:需要安装Office软件.速度问题: 2.table输出Excel在 ...

  6. os模块大全详情

    python常用模块目录 一:os模块分类: python os.walk详解 二:os模块大全表 序号 方法 方法 1 os.access(path, mode) 检验权限模式 2 os.chdir ...

  7. UI优秀框架(库)

    1.vux 官网:https://doc.vux.li/zh-CN/ Github:https://github.com/airyland/vux 13818  Stars  3064 Forks   ...

  8. ES6的新特性(3)——变量的解构赋值

    变量的解构赋值 数组的解构赋值 基本用法 ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). let a = 1; let b = 2; le ...

  9. 6. 网络信息API

    一.用数值表示socket地址&用名字表示socket地址(socket地址==>IP地址和端口号) 1. 用数值表示socket地址不便于记忆,也不便于扩展(比如从IPv4转移到IPv ...

  10. border、margin、padding三者的区别

    当你写前端的时候,肯定会遇到border,margin和padding这几个单词. 如: padding: 16px 0; margin: 0 10px; 在CSS中,他们是表示距离的东西,很多人刚开 ...