Formato de código de bytes de AGAL

El código de bytes de AGAL debe utilizar formato Endian.LITTLE_ENDIAN.

Encabezado del código de bytes

El código de bytes de AGAL debe comenzar con un encabezado de 7 bytes:

A0 01000000 A1 00 -- for a vertex program 
A0 01000000 A1 01 -- for a fragment program

Desplazamiento (bytes)

Tamaño (bytes)

Nombre

Descripción

0

1

magic

debe ser 0xa0

1

4

version

debe ser 1

5

1

ID de tipo de sombreador

debe ser 0xa1

6

1

tipo de sombreador

0 para un programa de vértices; 1 para un programa de fragmentos

Símbolos

El encabezado va inmediatamente seguido de cualquier número de símbolos. Cada símbolo tiene un tamaño de 192 bits (24 bytes) y siempre tiene el formato:

[opcode][destination][source1][source2 o sampler]

No todos los códigos de operación utilizan todos estos campos. Los campos no utilizados deben establecerse en 0.

Códigos de operación

El campo [opcode] tiene un tamaño de 32 bits y puede tomar uno de los valores siguientes:

Nombre

Código de operación

Operación

Descripción

mov

0x00

mover

mueve datos de source1 a destination, en el sentido de los componentes

add

0x01

sumar

destination = source1 + source2, en el sentido de los componentes

sub

0x02

restar

destination = source1 - source2, en el sentido de los componentes

mul

0x03

multiplicar

destination = source1 * source2, en el sentido de los componentes

div

0x04

dividir

destination = source1 / source2, en el sentido de los componentes

rcp

0x05

recíproco

destination = 1/source1, en el sentido de los componentes

min

0x06

mínimo

destination = minimum(source1,source2), en el sentido de los componentes

max

0x07

máximo

destination = maximum(source1,source2), en el sentido de los componentes

frc

0x08

fraccional

destination = source1 - (float)floor(source1), en el sentido de los componentes

sqt

0x09

raíz cuadrada

destination = sqrt(source1), en el sentido de los componentes

rsq

0x0a

raíz recíproca

destination = 1/sqrt(source1), en el sentido de los componentes

pow

0x0b

potencia

destination = pow(source1,source2), en el sentido de los componentes

log

0x0c

logaritmo

destination = log_2(source1), en el sentido de los componentes

exp

0x0d

exponencial

destination = 2^source1, en el sentido de los componentes

nrm

0x0e

normalizar

destination = normalize(source1), en el sentido de los componentes (produce solo un resultado de 3 componentes, destination debe estar enmascarado en .xyz o valor inferior)

sin

0x0f

seno

destination = sin(source1), en el sentido de los componentes

cos

0x10

coseno

destination = cos(source1), en el sentido de los componentes

crs

0x11

producto cruzado

destination.x = source1.y * source2.z - source1.z * source2.y

destination.y = source1.z * source2.x - source1.x * source2.z

destination.z = source1.x * source2.y - source1.y * source2.x

(produce solo un resultado de 3 componentes, destination debe estar enmascarado en .xyz o valor inferior)

dp3

0x12

producto de puntos

destination = source1.x*source2.x + source1.y*source2.y + source1.z*source2.z

dp4

0x13

producto de puntos

destination = source1.x*source2.x + source1.y*source2.y + source1.z*source2.z + source1.w*source2.w

abs

0x14

absoluto

destination = abs(source1), en el sentido de los componentes

neg

0x15

negativo

destination = -source1, en el sentido de los componentes

sat

0x16

saturar

destination = maximum(minimum(source1,1),0), en el sentido de los componentes

m33

0x17

multiplicar por matriz 3x3

destination.x = (source1.x * source2[0].x) + (source1.y * source2[0].y) + (source1.z * source2[0].z)

destination.y = (source1.x * source2[1].x) + (source1.y * source2[1].y) + (source1.z * source2[1].z)

destination.z = (source1.x * source2[2].x) + (source1.y * source2[2].y) + (source1.z * source2[2].z)

(produce solo un resultado de 3 componentes, destination debe estar enmascarado en .xyz o valor inferior)

m44

0x18

multiplicar por matriz 4x4

destination.x = (source1.x * source2[0].x) + (source1.y * source2[0].y) + (source1.z * source2[0].z) + (source1.w * source2[0].w)

destination.y = (source1.x * source2[1].x) + (source1.y * source2[1].y) + (source1.z * source2[1].z) + (source1.w * source2[1].w)

destination.z = (source1.x * source2[2].x) + (source1.y * source2[2].y) + (source1.z * source2[2].z) + (source1.w * source2[2].w)

destination.w = (source1.x * source2[3].x) + (source1.y * source2[3].y) + (source1.z * source2[3].z) + (source1.w * source2[3].w)

m34

0x19

multiplicar por matriz 3x4

destination.x = (source1.x * source2[0].x) + (source1.y * source2[0].y) + (source1.z * source2[0].z) + (source1.w * source2[0].w)

destination.y = (source1.x * source2[1].x) + (source1.y * source2[1].y) + (source1.z * source2[1].z) + (source1.w * source2[1].w)

destination.z = (source1.x * source2[2].x) + (source1.y * source2[2].y) + (source1.z * source2[2].z) + (source1.w * source2[2].w)

(produce solo un resultado de 3 componentes, destination debe estar enmascarado en .xyz o valor inferior)

kil

0x27

eliminar/descartar (solamente sombreado de fragmentos)

Si un único componente de origen escalar es menor que cero, el fragmento se descarta y no se lleva al búfer de fotogramas. (El registro del destino debe establecerse todo en 0)

tex

0x28

muestra de textura (solamente sombreado de fragmentos)

destination equals load from texture source2 at coordinates source1. En este caso, source2 debe estar en formato de muestreador.

sge

0x29

establecido si es mayor o igual que

destination = source1 >= source2 ? 1 : 0, en el sentido de los componentes

slt

0x2a

establecido si es menor que

destination = source1 < source2 ? 1 : 0, en el sentido de los componentes

seq

0x2c

establecido si es igual que

destination = source1 == source2 ? 1 : 0, en el sentido de los componentes

sne

0x2d

establecido si no es igual que

destination = source1 != source2 ? 1 : 0, en el sentido de los componentes

Formato de campo de destino

El campo [destination] tiene 32 bits de tamaño:

31.............................0 
----TTTT----MMMMNNNNNNNNNNNNNNNN

T = Tipo de registro (4 bits)

M = Máscara de escritura (4 bits)

N = Número de registro (16 bits)

- = sin definir, debe ser 0

Formato de campo de origen

El campo [source] tiene 64 bits de tamaño:

63.............................................................0 
D-------------QQ----IIII----TTTTSSSSSSSSOOOOOOOONNNNNNNNNNNNNNNN

D = Directo=0/Indirecto=1 para directo se omiten Q e I, 1 bit

Q = Selección de componentes de registro de índices (2 bits)

I = Tipo de registro de índices (4 bits)

T = Tipo de registro (4 bits)

S = Reordenación (8 bits, 2 bits por componente)

O = Desplazamiento indirecto (8 bits)

N = Número de registro (16 bits)

- = sin definir, debe ser 0

Formato de campo de muestreador

El segundo campo de origen para el código de operación tex debe estar en formato [sampler], con tamaño de 64 bits:

63.............................................................0 
FFFFMMMMWWWWSSSSDDDD--------TTTT--------BBBBBBBBNNNNNNNNNNNNNNNN

N = Número de registro del muestreador (16 bits)

B = Nivel de detalle de textura (NdD) parcial, entero con signo, escala por 8. El valor de coma flotante utilizado es b/8.0 (8 bits)

T = Tipo de registro, debe ser 5, muestreador (4 bits)

F = Filtro (0=más cercano,1=lineal) (4 bits)

M = Mipmap (0=desactivado,1=más cercano, 2=lineal)

W = Envoltura (0=fijación,1=repetición)

S = Bits especiales de indicación (debe ser 0)

D = Dimensión (0=2D, 1=Cubo)

Registros de programa

Se definen los siguientes tipos de registros: Utilice el valor mostrado para especificar un tipo de registro en los campos de un símbolo:

Nombre

Valor

Número por programa de fragmentos

Número por programa de vértices

Uso

Atributo

0

No disponible

8

Entrada de sombreador de vértices; se lee desde un búfer de vértices especificado con Context3D.setVertexBufferAt().

Constante

1

28

128

Entrada de sombreador; se establece con la familia de funciones Context3D.setProgramConstants().

Temporal

2

8

8

Registro temporal para computación, no accesible desde fuera del programa.

Salida

3

1

1

Salida de sombreador: en un programa de vértices, el resultado es la posición del espacio del clip; en un programa de fragmentos, el resultado es un color.

Varying

4

8

8

Transfiera datos interpolados entre sombreadores de vértices y fragmentos. Los registros variantes desde el programa de vértices se aplican como entrada para el programa de fragmentos. Los valores se interpolan según la distancia desde los vértices del triángulo.

Sampler

5

8

No disponible

Entrada de sombreador de fragmentos; lee desde una textura especificada mediante Context3D.setTextureAt().