低版本 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. [BZOJ4444][SCOI2015]国旗计划-[ST表]

    Description 传送门 Solution 说真的这道题在场上没做出来的我必定是脑子有洞.. 我们用st表记录以某个位置开始,派了1<<j个战士能到达的最远位置. 由于边境线是一圈, ...

  2. Why HBase

    3.1.1,为什么选用HBases a)      容量巨大 HBase 的单表可以有百亿行.百万列,数据矩阵横向和纵向两个维度所支持的数据量级 都非常具有弹性.传统的关系型数据库,如 Oracle ...

  3. day 5 多态 类 静态

    1.多态 执行的时候才知道调用谁 class Dog(object): def print_self(self): print("大家好,我是来自西安的小白") class Xia ...

  4. 详解UML图之类图

    产品经理的必备技能之一是画UML图,本文就告诉你怎么画标准的类图吧.本文结合网络资料和个人心得所成,不当之处,请多指教. 1.为什么需要类图?类图的作用 我们做项目的需求分析,最开始往往得到的是一堆文 ...

  5. 向日期添加指定的时间间隔(mysql)

    DATE_ADD( 原始日期, INTERVAL 要加的年数 YEAR) DATE_ADD( 原始日期, INTERVAL 要加的月份 MONTH) DATE_ADD( 原始日期, INTERVAL ...

  6. 基于ejabberd简单实现xmpp群聊离线消息

    首先,xmpp服务器是基于ejabberd.离线消息模块是mod_interact,原地址地址:https://github.com/adamvduke/mod_interact: 修改后实现群聊离线 ...

  7. Charles连接苹果及JSON乱码情况解决

    1.  Charles的JSON乱码情况解决: 点击Charles界面上的help—SSL proxying—install Charles Root Certificate,将证书安装到[受信任的根 ...

  8. 初次学习asp.net core的心得

    初次学习Asp.Net Core方面的东西,虽然研究的还不是很深,今天主要是学习了一下Asp.Net Core WebAPI项目的使用,发现与Asp.Net WebAPI项目还是有很多不同.不同点包含 ...

  9. Nginx高性能优化

    #Nginx配置文件优化 worker_processes ; # nginx进程数,建议按照cpu数目来指定,一般为它的倍数. worker_cpu_affinity ; # 为每个进程分配CPU的 ...

  10. MongoDB Chapter1:Introduction

    你是在防火墙后面吗? 为了继续本课程,您必须能够将计算机的传出请求发送到我们在MongoDB Atlas中设置的数据库服务器.这些服务器在Amazon AWS中的端口27017上运行. 请单击http ...