Metal 着色语言编程指南 十八

矩阵的操作符(Operators on Matrix)

加,减操作符(+, -) 适用于矩阵运算。  但是要求参与运算的矩阵行数和列数必须相等。 其运算过程就是矩阵的每个相同位置的分量执行加或者减操作,  其结果为相同大小的矩阵。   乘操作符(*) 可以适用于:

  1. 标量与矩阵
  2. 矩阵与标量
  3. 矢量与矩阵
  4. 矩阵与矢量
  5. 矩阵与矩阵

标量乘矩阵运算的过程是,  此标量与矩阵的每个成员相乘, 其结果为大小同参与运算矩阵一样的矩阵。 举例如下:

float3x3 m;
float a = 3.0f;
float3x3 m1 = m * a;
//  equivant to
m1[0][0] = m[0][0] * a;
m1[0][1] = m[0][1] * a;
m1[0][2] = m[0][2] * a;
m1[1][0] = m[1][0] * a;
m1[1][1] = m[1][1] * a;
m1[1][2] = m[1][2] * a;
m1[2][0] = m[2][0] * a;
m1[2][1] = m[2][1] * a;
m1[2][2] = m[2][2] * a;

矢量与矩阵, 或者矩阵与矩阵相乘要复杂一些, 矢量操作数在左边的话, 被编译器视为行矢量, 在右则被编译器视为列矢量。     左边的操作数的列数必须与右边操作数的行数相等, 那么相乘才被认为是合法的。  举例如下:

float3 v;
float3x3 m;
float3 u = m * v;
// equivant to
u = v.x * m[0];
u += v.y * m[1];
u += v.z * m[2];

矩阵与矩阵相乘, 举例如下:

float3x3    m, n, r;
r = m * n;
//  equivant to
r[0] = m[0] * n[0].x;
r[0] += m[1] * n[0].y;
r[0] += m[2] * n[0].z;

r[1] = m[0] * n[1].x;
r[1] += m[1] * n[1].y;
r[1] += m[2] * n[1].z;

r[2] = m[0] * n[2].x;
r[2] += m[1] * n[2].y;
r[2] += m[2] * n[2].z;


第三章 操作符 完。

译自:

https://developer.apple.com/library/ios/documentation/Metal/Reference/MetalShadingLanguageGuide/operators/operators.html#//apple_ref/doc/uid/TP40014364-CH3-SW1

时间: 2024-10-29 11:42:45

Metal 着色语言编程指南 十八的相关文章

编译opengl编程指南第八版示例代码通过

最近在编译opengl编程指南第八版的示例代码,如下 1 #include <iostream> 2 #include "vgl.h" 3 #include "LoadShaders.h" 4 5 using namespace std; 6 7 8 enum VAO_IDs { Triangles, NumVAOs }; 9 enum Buffer_IDs { ArrayBuffer, NumBuffers }; 10 enum Attrib_IDs

c#编程指南(十) 平台调用P-INVOKE完全掌握, 字符串和指针

可以说新手使用P-INVOKE最开始的头疼就是C#和C++的字符串传递,因为这里涉及到两个问题. 第一:C#的string和C++的字符串首指针如何对应. 第二:字符串还有ANSI和UNICODE(宽字符串)之分. 本文分三部分阐述: 第一:字符串指针当输入参数, 第二:字符串指针作为返回值, 第三:字符串指针作为输入输出参数. C++部分的测试代码很简单这里就全部贴出来了: 1 #include "stdafx.h" 2 #include "TestDll.h"

C++语言学习(十八)——异常处理

C++语言学习(十八)--异常处理 一.C语言异常处理 异常是指程序在运行过程中产生可预料的执行分支.如除0操作,数组访问越界.要打开的文件不存在.Bug是指程序中的错误,是不被预期的运行方式.如野指针.堆空间使用结束未释放.C语言中处理异常的方式一般是使用if....else...分支语句. double divide(double a, double b) { const double delta = 0.000000000000001; double ret = 0; if( !((-de

Go语言开发(十八)、Go语言MySQL数据库操作

Go语言开发(十八).Go语言MySQL数据库操作 一.MySQL数据库驱动 1.MySQL数据库驱动简介 Go语言官方没有实现MySQL数据库驱动,常用的开源MySQL数据库驱动实现如下:(1)Go MySQL DriverGo MySQL Driver支持database/sql接口,全部采用Go语言实现.官方网站:https://github.com/go-sql-driver/mysql/(2)MyMySQLMyMySQL支持database/sql接口,也支持自定义的接口,全部采用Go

Java编程思想(十八) —— 再谈反射

在Java编程思想(十五) -- 类型信息之反射和Java编程思想(十六) -- 联系JVM再谈Class,书上只用了3页就讲完了,还有讲了那么多Class的东西,接下来要从反射中怎么用,自己结合API和其他资料再写多一些. 示例:Test.java public class Test { public Test() {     }      public Test(int i) {         System.out.println(i);     } private void pri()

java并发编程(十八)阻塞队列和阻塞栈

阻塞队列 阻塞队列是Java 5并发新特性中的内容,阻塞队列的接口是java.util.concurrent.BlockingQueue,它有多个实现类:ArrayBlockingQueue.DelayQueue.LinkedBlockingQueue.PriorityBlockingQueue.SynchronousQueue等,用法大同小异,具体可查看JDK文档,这里简单举例看下ArrayBlockingQueue,它实现了一个有界队列,当队列满时,便会阻塞等待,直到有元素出队,后续的元素才

C语言入门(十八)数组和指针

数组和指针  前言: 指针和数组有着密切的关系,任何能由数组下标完成的操作也都可用指针来实现,但程序中使用指针可使代码更紧凑.更灵活. 一.指向数组元素的指针 我们定义一个整型数组和一个指向整型的指针变量: int a[10], *p; 和前面介绍过的方法相同,可以使整型指针p指向数组中任何一个元素,假定给出赋值运算 p=&a[0]; 此时,p指向数组中的第0号元素,即a[0],指针变量p中包含了数组元素a[0]的地址,由于数组元素在内存中是连续存放的,因此,我们就可以通过指针变量p及其有关运算

C语言编程时常犯十八个错误

C语言的最大特点是:功能强.使用方便灵活.C编译的程序对语法检查并不象其它高级语言那么严格,这就给编程人员留下"灵活的余地",但还是由于这个灵活给程序的调试带来了许多不便,尤其对初学C语言的人来说,经常会出一些连自己都不知道错在哪里的错误.看着有错的程序,不知该如何改起,本人通过对C的学习,积累了一些C编程时常犯的错误,写给各位学员以供参考.1.书写标识符时,忽略了大小写字母的区别.main(){ int a=5; printf("%d",A);}编译程序把a和A认

Swift语言指南(十)--字符串与字符

原文:Swift语言指南(十)--字符串与字符 字符串是一段字符的有序集合,如"hellow,world"或"信天翁".Swift 中的字符串由 String 类型表示,对应着 Character 类型值的集合. Swift 中的 String 类型为你的编程提供了一个高速的,兼容 Unicode规范 的文本处理方式.Swift 创建和处理字符串的语法轻量可读,与 C 语言的字符串语法颇为相似.字符串的拼接非常简单,只需将两个字符串用 + 运算符相加.字符串的值是否