GLSL反转矩阵inverse
低版本 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的更多相关文章
- 控制反转(IOC: Inverse Of Control) & 依赖注入(DI: Independence Inject)
举例:在每天的日常生活中,我们离不开水,电,气.在城市化之前,我们每家每户需要自己去搞定这些东西:自己挖水井取水,自己点煤油灯照明,自己上山砍柴做饭.而城市化之后,人们从这些琐事中解放了出来,城市中出 ...
- C# 控制反转(IOC: Inverse Of Control) & 依赖注入(DI: Independence Inject)
举例:在每天的日常生活中,我们离不开水,电,气.在城市化之前,我们每家每户需要自己去搞定这些东西:自己挖水井取水,自己点煤油灯照明,自己上山砍柴做饭.而城市化之后,人们从这些琐事中解放了出来,城市中出 ...
- 图片变换【Matrix】矩阵 简介
Matrix矩阵介绍 官方文档地址:https://developer.android.com/reference/android/graphics/Matrix.html 在Android中,对图片 ...
- 06章 映射一对多双向关联关系、以及cascade、inverse属性
当类与类之间建立了关联,就可以方便的从一个对象导航到另一个对象.或者通过集合导航到一组对象.例如: 对于给定的Emp对象,如果想获得与它关联的Dept对象,只要调用如下方法 Dept dept=emp ...
- Spring控制反转与依赖注入(IOC、DI)
IOC: 反转控制 Inverse Of Control DI:依赖注入 Dependency Injection 目的:完成程序的解耦合 解释:在应用系统的开发过程中,有spring负责对象的创 ...
- 映射一对多双向关联关系 cascade、inverse、属性
当类与类之间建立了关联,就可以方便的从一个对象导航到另一个对象.或者通过集合导航到一组对象.例如: 对于给定的Emp对象,如果想获得与它关联的Dept对象,只要调用如下方法 Dept dept=emp ...
- Inverse属性和cascade属性以及集合的多对多关系
Inverse属性 Inverse属性,是在维护关联关系的时候起作用的. 表示控制权是否转移.(在一的一方起作用) Inverse = true, 控制反转. Inverse = false 不反转 ...
- Hibernate框架--关联映射,一对多,多对多 inverse cascade
回顾Hibernate: 1. hibernate开发环境搭建 ----> 引入jar: hibernate.jar + required + jpa + 驱动包 ---> hiberna ...
- Hibernate 集合映射 一对多多对一 inverse属性 + cascade级联属性 多对多 一对一 关系映射
1 . 集合映射 需求:购物商城,用户有多个地址. // javabean设计 // javabean设计 public class User { private int userId; privat ...
随机推荐
- vector的二维用法+前缀和
题目链接:https://codeforces.com/contest/1082/problem/C(C. Multi-Subject Competition) A multi-subject com ...
- 【转载】OGRE 2.1 Windows 编译
OGRE 2.1 Windows 编译 环境: Windows 7 64Bit Visual Studio 2012 OGRE 2.1 CMake 2.8.12.1 OGRE: OGRE官方推出了最新 ...
- 润乾报表整合到Tomcat服务器的部署过程
转载自:http://www.cnblogs.com/avivaye/archive/2012/11/16/2773681.html 使用第三方的报表设计器/服务器来快速的开发报表. 润乾服务器是使用 ...
- Base64编码后通过Url传值
Base64编码简介 Base编码使用"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",再加上补 ...
- commons fileupload上传报错
这个问题困扰我好久了一直没有找到解决方法,先记录下来. 生产环境(简称A)上老是出错,而测试环境(简称B)一切正常. 我们的框架是JAVA语言编写,基于struts1技术总监自己搭的框架,我在stru ...
- 动态权限<一>基本介绍
android 6.0以上为了保护用户的隐私,和以往被人诟病的权限机制,确立了新的权限机制.从 Android 6.0(API 级别 23)开始,用户开始在应用运行时向其授予权限,而不是在应用安装时授 ...
- 如何运用 Powershell 修改Office365和AD账户
这段时间需要大量地修改AD用户的一些属性,例如邮件,UPN,登录名等等,以便和Office365的登录账号保持一致.写了个简单脚本进行批量修改. #Import AD ModuleImport-Mod ...
- 使用Xamarin实现串口通讯
前几天我写了年度总结,然后有人说让我教一下他Xamarin串口通讯怎么做,其实跟java没有多大区别. 记得我刚开始接到公司这个项目的时候很懵逼,我去看了别的安卓串口工具,都不行我当时是RS232串口 ...
- Ubuntu16.04下安装显卡驱动记录
安装环境及硬件信息 Ubuntu16.04 LTS 内核版本:4.4.0 显卡:Nvidia GeForce GTX 1060 安装过程 一.首先要下载好显卡驱动程序,官方网址:http://www. ...
- 福大软工1816 - 404 Note Found选题报告
目录 NABCD分析引用 N(Need,需求): A(Approach,做法): B(Benefit,好处): C(Competitors,竞争): D(Delivery,交付): 初期 中期 个人贡 ...