AGAL 바이트코드 형식

AGAL 바이트코드는 Endian.LITTLE_ENDIAN 형식을 사용해야 합니다.

바이트코드 헤더

AGAL 바이트코드는 다음과 같이 7바이트 헤더로 시작해야 합니다.

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

오프셋(바이트)

크기(바이트)

이름

설명

0

1

magic

0xa0이어야 함

1

4

version

1이어야 함

5

1

shader type ID

0xa1이어야 함

6

1

shader type

정점 프로그램의 경우 0, 조각 프로그램의 경우 1

토큰

헤더 바로 다음에 개수에 상관없이 토큰이 이어집니다. 모든 토큰의 크기는 192비트(24바이트)이고 형식은 항상 다음과 같습니다.

[opcode][destination][source1][source2 또는 sampler]

특정 opcode에서는 이러한 필드 중 일부를 사용하지 않습니다. 사용되지 않는 필드는 0으로 설정되어야 합니다.

작업 코드

[opcode] 필드의 크기는 32비트이고 다음 값 중 하나일 수 있습니다.

이름

Opcode

작업

설명

mov

0x00

이동

데이터를 source1에서 destination으로 이동, 구성 요소 전체

add

0x01

더하기

destination = source1 + source2, 구성 요소 전체

sub

0x02

빼기

destination = source1 - source2, 구성 요소 전체

mul

0x03

곱하기

destination = source1 * source2, 구성 요소 전체

div

0x04

나누기

destination = source1 / source2, 구성 요소 전체

rcp

0x05

destination = 1/source1, 구성 요소 전체

min

0x06

최소

destination = minimum(source1,source2), 구성 요소 전체

max

0x07

최대

destination = maximum(source1,source2), 구성 요소 전체

frc

0x08

소수

destination = source1 - (float)floor(source1), 구성 요소 전체

sqt

0x09

제곱근

destination = sqrt(source1), 구성 요소 전체

rsq

0x0a

역의 근

destination = 1/sqrt(source1), 구성 요소 전체

pow

0x0b

destination = pow(source1,source2), 구성 요소 전체

log

0x0c

로그

destination = log_2(source1), 구성 요소 전체

exp

0x0d

지수

destination = 2^source1, 구성 요소 전체

nrm

0x0e

표준화

destination = normalize(source1), 구성 요소 전체(3요소 결과만 산출하며, 대상은 .xyz 이하로 마스크 처리되어야 함)

sin

0x0f

사인

destination = sin(source1), 구성 요소 전체

cos

0x10

코사인

destination = cos(source1), 구성 요소 전체

crs

0x11

외적

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

(3요소 결과만 산출하며, 대상은 .xyz 이하로 마스크 처리되어야 함)

dp3

0x12

내적

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

dp4

0x13

내적

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

abs

0x14

절대

destination = abs(source1), 구성 요소 전체

neg

0x15

무효화

destination = -source1, 구성 요소 전체

sat

0x16

포화

destination = maximum(minimum(source1,1),0), 구성 요소 전체

m33

0x17

곱하기 행렬 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)

(3요소 결과만 산출하며, 대상은 .xyz 이하로 마스크 처리되어야 함)

m44

0x18

곱하기 행렬 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

곱하기 행렬 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)

(3요소 결과만 산출하며, 대상은 .xyz 이하로 마스크 처리되어야 함)

kil

0x27

삭제(조각 셰이더만 해당)

단일 스칼라 값의 소스 구성 요소가 0보다 작은 경우 조각은 삭제되고 프레임 버퍼에 그려지지 않습니다. (대상 레지스터는 모두 0으로 설정되어야 함)

tex

0x28

텍스처 샘플(조각 셰이더만 해당)

destination은 source1 좌표에서 source2 텍스처의 로드와 동일합니다. 이 경우 source2는 샘플러 형식이어야 합니다.

sge

0x29

같거나 큰 경우 설정

destination = source1 >= source2 ? 1 : 0, 구성 요소 전체

slt

0x2a

작은 경우 설정

destination = source1 < source2 ? 1 : 0, 구성 요소 전체

seq

0x2c

같은 경우 설정

destination = source1 == source2 ? 1 : 0, 구성 요소 전체

sne

0x2d

같지 않은 경우 설정

destination = source1 != source2 ? 1 : 0, 구성 요소 전체

Destination 필드 형식

[destination] 필드의 크기는 32비트:

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

T = 레지스터 유형(4비트)

M = 쓰기 마스크(4비트)

N = 레지스터 번호(16비트)

- = 정의되지 않음, 0이어야 함

Source 필드 형식

[source] 필드의 크기는 64비트:

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

D = 직접=0/간접=1(직접 Q 및 I는 무시됨), 1비트

Q = 인덱스 레지스터 구성 요소 선택(2비트)

I = 인덱스 레지스터 유형(4비트)

T = 레지스터 유형(4비트)

S = Swizzle(8비트, 구성 요소당 2비트)

O = 간접 오프셋(8비트)

N = 레지스터 번호(16비트)

- = 정의되지 않음, 0이어야 함

Sampler 필드 형식

tex opcode의 두 번째 source 필드는 64비트 크기의 [sampler] 형식이어야 함:

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

N = Sampler 레지스터 번호(16비트)

B = 텍스처 LOD(Level-of-Detail) 편차, 부호 있는 정수, 배율: 8. 사용되는 부동 소수점 값은 b/8.0(8비트)입니다.

T = 레지스터 유형, 5여야 함, Sampler(4비트)

F = 필터(0=가장 가까움, 1=선형)(4비트)

M = 밉맵(0=사용 안 함, 1=가장 가까움, 2=선형)

W = 래핑(0=클램프, 1=반복)

S = 특수 플래그 비트(0이어야 함)

D = 차원(0=2D, 1=정육면체)

프로그램 레지스터

다음과 같은 레지스터 유형이 정의되어 있습니다. 나열된 값을 사용하여 토큰의 필드에 레지스터 유형을 지정하십시오.

이름

조각 프로그램당 수

정점 프로그램당 수

사용

특성

0

해당 사항 없음

8

정점 셰이더 입력, Context3D.setVertexBufferAt()을 사용하여 지정된 정점 버퍼에서 읽어옴

상수

1

28

128

세이더 입력, Context3D.setProgramConstants() 함수 모음을 사용하여 설정

임시

2

8

8

계산을 위한 임시 레지스터, 프로그램 외부에서 액세스할 수 없음

출력

3

1

1

셰이더 출력: 정점 프로그램에서는 출력이 클립 공간 위치에 있고, 조각 프로그램에서는 출력이 색상임

변형

4

8

8

정점 셰이더와 조각 셰이더 간에 보간 데이터를 전송합니다. 정점 프로그램의 가변 레지스터는 조각 프로그램에 입력으로 적용됩니다. 값은 삼각형 꼭지점으로부터의 거리에 따라 보간됩니다.

샘플러

5

8

해당 사항 없음

조각 셰이더 입력, Context3D.setTextureAt()을 사용하여 지정된 텍스처에서 읽어옴