博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AGAL寄存器
阅读量:5139 次
发布时间:2019-06-13

本文共 1777 字,大约阅读时间需要 5 分钟。

使用AGAL寄存器

AGAL不像ActionScript和其它高级语言那样用变量来存储数据,而只使用寄存器。寄存器是GPU中的小块内存区域,供AGAL程序(着色器)运行时使用。寄存器用来存储AGAL运算过程中的数据及结果。你也可以通过寄存器向着色器传递参数。

 

每个寄存器为128位,这意味着其可以存放4个浮点数,每一个浮点数被称为寄存器的一个分量(component)。

 

这些寄存器中的分量既可以通过坐标访问器(xyzw)也可以通过颜色访问器(RGBA)进行访问。

 

寄存器中第一个分量,既可以通过坐标访问器访问:

  1. <register name>.x

 

也可以通过颜色访问器访问:

  1. <register name>.r

 

有些时候寄存器中存放的是坐标数据,有些时候存放颜色数据。通过使用正确的访问器,可以使你的代码清晰易读。

 

以上opcode中的有些指令比如:add,执行的是分量形式(component wise)的操作,意思是说,按分量相加,即:x分量加x分量,y分量加y分量等等。

 

在AGAL中有6种可用的寄存器。

 

1、属性寄存器

 

这些寄存器存放 VertextBuffer中定义的顶点属性数据,即顶点着色器的输入,因此,它们只能在顶点着色器中使用。

 

这是顶点着色器负责处理的主要的数据流,VertextBuffer中的每个顶点属性都有自己对应的属性寄存器。

 

用函数:Context3d:setVertexBufferAt(),将一个VertexBuffer属性以合适的索引,赋值给特定的属性寄存器。在着色器中可以通过语法:va<n>的形式来访问这个属性,<n>为寄存器的索引编号。

 

顶点着色器可用的属性寄存器一共有8个。

 

2、常量寄存器

 

这些寄存器的 作用为从ActionScript像着色器传递参数,由Context3D:setProgramConstants()等一系列函数执行。在顶点着色器 和片段着色器程序中,分别以vc<n>和fc<n>的形式访问这些寄存器,<n>同样为寄存器的索引编号。

 

顶点着色器中可用的常量寄存器为128个,片段着色器中为28个。

 

3、临时寄存器

 

这些寄存器在着色器中用来做临时计算。既然AGAL没有变量,所以你需要临时寄存器来保存计算过程中的中间数据。

 

临时寄存器以vt<n>(在顶点着色器中)和ft<n>(在片段着色器中)的语法形式访问,<n>代表寄存器编号。

 

顶点着色器和片段着色器各有8个临时寄存器可用。

 

4、输出寄存器

 

输出寄存器用来存放顶点和片段着色器的运算结果,即顶点着色器中顶点的坐标值和片段着色器中像素的颜色值。

 

在顶点着色器程序中通过语法:op的形式访问,在片段着色器中通过语法:oc的形式方式。

 

很显然,顶点和片段着色器各只有一个输出寄存器。

 

5、可变寄存器

 

这些寄存器用来从顶点着色器向片段着色器传递数据。传递过来的数据已经被GPU进行了适当的插值,以便片段着色器得到正确的像素数据。

 

这种数据的典型代表为顶点颜色或者纹理的UV坐标值。

 

这些寄存器可以通过v<n>的形式访问,<n>为寄存器编号。

 

共有8个可变寄存器。

 

6、纹理采样寄存器

 

纹理采样寄存器用来存放从纹理贴图中基于UV坐标采集的颜色值。

 

通过ActionScript调用Context3D::setTextureAt()函数来指定要使用纹理。

 

使用纹理采样寄存器的语法形式为:fs<n> <flags>,<n>代表采样寄存器编号,<flags>代表一些列指定如何进行采样的标识。<flags>是一个逗号分割的字符串,它由如下值可用:

  1. 纹理维度。包括:2d,cube.
  2. 多重材质映射,包括:nomip(或者mipnone,意思相同),mipnearest,miplinear。
  3. 纹理过滤,包括:nearest,linear。
  4. 重复纹理贴图,包括:repeat,wrap,clamp。

例如:一个标准的不带多重材质映射和渐变过滤的2D纹理,采样到临时寄存器ft1中,由如下代码表示:

  1. tex ft1, v0, fs0 <2d,linear,nomip>

 

上例中,可变寄存器v0中存放着经过插值的纹理UV坐标。

转载于:https://www.cnblogs.com/lvwj/archive/2012/11/07/2758882.html

你可能感兴趣的文章
黑马程序员___Java基础[05-内部类和异常]
查看>>
访问局域网中机器不能访问
查看>>
Centos 7 Sublime 安装 package control
查看>>
html学习笔记(1)--处理特殊字符以及其他的一些小细节
查看>>
【MySQL】MySQL的约束
查看>>
web开发的三层架构
查看>>
Idea 常用快捷键列表
查看>>
让xamarin的Entry绑定时,支持Nullable类型
查看>>
linux 中安装JDK
查看>>
高精度加法和乘法
查看>>
SQL 语句的执行顺序
查看>>
SQL 参数化查询 应用于 Like
查看>>
[CareerCup] 2.3 Delete Node in a Linked List 删除链表的节点
查看>>
[LeetCode] Find K Pairs with Smallest Sums 找和最小的K对数字
查看>>
左右轮播无缝效果
查看>>
HTML 链接是通过 <a> 标签进行定义的
查看>>
Cocos2d Box2D之静态刚体
查看>>
UDP和TCP两种协议的传输数据长度分析
查看>>
ppt 例题8 多重背包2
查看>>
倒序--逆序=2
查看>>