低版本 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. echarts y轴,显示数据,但不显示竖线

    在yAxis中插入: axisLine: {show:false}, axisTick: {show:false}, yAxis : [ { show:true, axisLine: {show:fa ...

  2. Mac 用Ctr+C复制,Ctr+V 粘贴

    用习惯Windows的用户,进入Mac,不习惯快捷方式. 用下面的方法,可以返回windows 习惯. 1.进入系统偏好设置->键盘->修饰键 2.Control 选择 Command,C ...

  3. 图论-求有向图的强连通分量(Kosaraju算法)

    求有向图的强连通分量     Kosaraju算法可以求出有向图中的强连通分量个数,并且对分属于不同强连通分量的点进行标记. (1) 第一次对图G进行DFS遍历,并在遍历过程中,记录每一个点的退出顺序 ...

  4. sqlserver 导出数据到Excel

    1.导出非正式Excel EXEC master..xp_cmdshell 'bcp t.dbo.tcad out D:\MySelf\output\Temp.xls -c -q -S".& ...

  5. 洛谷3197&bzoj1008 越狱

    洛谷3197&bzoj1008 越狱 Luogu bzoj 题解 所有状态减合法状态.SBT 答案为\(m^n-m*(m-1)^{n-1}\)太SB不解释 注意取膜的问题.相减可能减出负数,而 ...

  6. Maven学习(十四)-----Maven 构建配置文件

    Maven 构建配置文件 什么是构建配置文件? 生成配置文件是一组可以用来设置或覆盖 Maven 构建配置值的默认值.使用生成配置文件,你可以针对不同的环境,如:生产V/S开发环境自定义构建. 配置文 ...

  7. 《More Effective C++》读书笔记(零)Basic 基础条款

    这是篇读书笔记,只记录自己的理解和总结,一般情况不对其举例子具体说明,因为那正是书本身做的事情,我的笔记作为梳理和复习之用,划重点.我推荐学C++的人都好好读一遍Effective C++ 系列,真是 ...

  8. YAML 基础

    YAML 基础 简介 对象 数组 常量 引用 1.  简介 YAML 是专门用来写配置文件的语言,非常简洁和强大! 它的基本语法规则有: 大小写敏感: 使用缩进表示层级关系: 缩进时不允许使用 Tab ...

  9. Visionpro学习网

    重码网是一个在线机器视觉学习网站,推出了Halcon,Visionpro机器视觉学习视频教程,视频内容通俗易懂,没有编程基础的同学,照着视频练习,也同样可以学会. 学机器视觉,拿高薪,成就技术大拿.重 ...

  10. 2.hive里的增删改查

    1.hive的增删改查 查询数据库 hive> show databases; OK default Time taken: 0.254 seconds, Fetched: 1 row(s) h ...