AGSL은 GLSL ES 1.0과 대부분 호환되도록 설계되었습니다. 자세한 내용은 OpenGL ES 셰이딩 언어 문서에서 상응하는 함수를 참고하세요. 이 문서에서는 가능한 경우 AGSL과 GLSL의 차이점을 설명합니다.
유형
AGSL은 GLSL ES 1.0 유형과 벡터 및 행렬 유형을 나타내는 추가 방법을 지원합니다. AGSL은 중간 정밀도를 나타내는 추가 short
및 half
유형을 지원합니다.
기본 유형
유형 | 설명 |
---|---|
void
|
함수 반환 값이 없거나 매개변수 목록이 비어 있습니다. GLSL과 달리 void 반환 유형이 없는 함수는 값을 반환해야 합니다. |
bool, bvec2, bvec3, bvec4 (bool2, bool3, bool4) . |
불리언 스칼라/벡터 |
int, ivec2, ivec3, ivec4 (int2, int3, int4) |
highp 부호 있는 정수/벡터
|
float, vec2, vec3, vec4 (float2, float3, float4)
|
highp (단일 정밀도) 부동 소수점 스칼라/벡터 |
short, short2, short3, short4
|
mediump int signed integer/vector와 같습니다. |
half, half2, half3, half4 |
mediump float 스칼라/벡터와 같습니다. |
mat2, mat3, mat4 (float2x2, float3x3, float4x4) |
2x2, 3x3, 4x4 float 행렬
|
half2x2, half3x3, half4x4 |
mediump float 행렬 유형과 같습니다. |
정밀도 및 범위 최솟값
이는 OpenGL ES 2.0 사양에 따라 각 수정자에 연결된 최소 보장 정밀도 및 범위입니다. 대부분의 기기는 ES 3.0을 지원하므로 더 보장된 highp
정밀도/범위와 int mediump
범위를 갖습니다. 정밀도 수정자는 스칼라, 벡터, 행렬 변수 및 매개변수에 적용할 수 있습니다. 아래에 나열된 최솟값만 보장됩니다. lowp
이 mediump
보다 실제로 정밀도가 낮을 필요는 없으며 mediump
이 highp
보다 정밀도가 낮을 필요는 없습니다. 현재 AGSL은 최종 출력에서 lowp
를 mediump
로 변환합니다.
수정자 | 'float' 범위 | 'float' 크기 범위 | 'float' 정밀도 | 'int' 범위 |
---|---|---|---|---|
highp | \(\left\{-2^{62},2^{62}\right\}\) | \(\left\{2^{-62},2^{62}\right\}\) | 상대적: \(2^{-16}\) | \(\left\{-2^{16},2^{16}\right\}\) |
mediump | \(\left\{-2^{14},2^{14}\right\}\) | \(\left\{2^{-14},2^{14}\right\}\) | 상대적: \(2^{-10}\) | \(\left\{-2^{10},2^{10}\right\}\) |
lowp | \(\left\{-2,2\right\}\) | \(\left\{2^{-8},2\right\}\) | 절대: \(2^{-8}\) | \(\left\{-2^{8},2^{8}\right\}\) |
배열 숫자 하위 표시자 구문(예: var[num], names of vector
components for vectors of length 2 - 4 are denoted by a single letter. Components
can be swizzled and replicated. ex:
vect.yx,
vect.yy) 외에도
vect.xyzw
- 점/노멀을 나타내는 벡터에 액세스할 때 사용
vect.rgba
- 색상을 나타내는 벡터에 액세스할 때 사용
vect.LTRB
- 벡터가 직사각형을 나타내는 경우 사용합니다 (GLSL 아님).
AGSL에서 0과 1은 해당 채널에서 상수 0 또는 1을 생성하는 데 사용할 수 있습니다.
예: vect.rgb1 == vec4(vect.rgb,1)
구조 및 배열
구조체는 GLSL과 동일한 문법으로 선언되지만 AGSL은 전역 범위의 구조체만 지원합니다.
struct type-name {
members
} struct-name; // optional variable declaration.
C 스타일 또는 GLSL 스타일 문법을 사용하여 명시적 배열 크기로 1차원 배열만 지원됩니다.
<base type>[<array size>] 변수 이름 - 예: half[10] x;
<base type> 변수 이름[<배열 크기>] - 예: half x[10];
배열은 함수에서 반환되거나, 복사, 할당, 비교될 수 없습니다. 배열 제한사항은 배열이 포함된 구조체로 전파됩니다. 배열은 상수 또는 루프 변수를 사용하여야만 색인을 지정할 수 있습니다.
예선
유형 | 설명 |
---|---|
const
|
컴파일 시간 상수 또는 읽기 전용 함수 매개변수 |
uniform
|
처리되는 원시값 전체에서 값이 변경되지 않습니다.
유니폼은 setColorUniform , setFloatUniform , setIntUniform , setInputBuffer , setInputShader 의 RuntimeShader 메서드를 사용하여 Android에서 전달됩니다. |
in
|
전달된 함수 매개변수의 경우 이는 기본값입니다. |
out
|
전달된 함수 매개변수의 경우 함수 정의와 동일한 정밀도를 사용해야 합니다. |
inout
|
함수에 전달되고 함수에서 전달되는 매개변수의 경우 함수 정의와 동일한 정밀도를 사용해야 합니다. |
변수 선언
선언은 명시적인 중괄호 범위에 있어야 합니다. 다음 샘플의 y
선언은 허용되지 않습니다.
if (condition)
int y = 0;
행렬/구조/배열 기본사항
행렬 생성자 예시
행렬이 단일 값으로 구성되면 대각선의 모든 값에 해당 값이 지정되고 나머지 값에는 0이 지정됩니다. 따라서 float2x2(1.0)
는 2x2 정체성 행렬을 만듭니다.
행렬이 여러 값으로 구성되면 열이 먼저 채워집니다(열 우선 순서).
GLSL과 달리 전달된 벡터의 구성요소 수를 줄이는 생성자는 지원되지 않지만, 전환을 사용하여 동일한 효과를 얻을 수 있습니다. GLSL과 동일한 동작으로 AGSL의 vec4
에서 vec3
를 구성하려면 vec3 nv = quadVec.xyz
를 지정합니다.
구조 생성자 예
struct light { float intensity; float3 pos; };
// literal integer constants auto-converted to floating point
light lightVar = light(3, float3(1, 2, 3.0));
행렬 구성요소
배열 하위 색인 지정 문법을 사용하여 행렬의 구성요소에 액세스합니다.
float4x4 m; // represents a matrix
m[1] = float4(2.0); // sets second column to all 2.0
m[0][0] = 1.0; // sets upper left element to 1.0
m[2][3] = 2.0; // sets 4th element of 3rd column to 2.0
구조 필드
기간 .
연산자를 사용하여 구조 필드를 선택합니다. 연산자는 다음과 같습니다.
연산자 | 설명 |
---|---|
. |
필드 선택 도구 |
==, != |
평등 |
= |
할당 |
배열 요소
배열 요소는 배열 하위 스크립트 연산자 [ ]
를 사용하여 액세스합니다. 예를 들면 다음과 같습니다.
diffuseColor += lightIntensity[3] * NdotL;
연산자
우선순위에 따라 번호가 매겨집니다. 관계 및 등식 연산자 > < <= >= == != 는 부울로 평가됩니다. 구성요소별로 벡터를 비교하려면 lessThan()
, equal()
등의 함수를 사용합니다.
연산자 | 설명 | 결합 | |
---|---|---|---|
1 | () |
괄호 그룹화 | 해당 사항 없음 |
2 | [] () . ++ --
|
배열 하위 표시자 함수 호출 및 생성자 구조 필드 또는 메서드 선택자, 스위즐 후위 증분 및 감소 | 왼쪽에서 오른쪽으로 |
3 | ++ -- + - !
|
접두사 증분 및 감소 단항 | 오른쪽에서 왼쪽으로 |
4 | * / |
곱셈 및 나눗셈 | 왼쪽에서 오른쪽으로 |
5 | + - |
더하기 및 빼기 | 왼쪽에서 오른쪽으로 |
7 | < > <= >= |
관계형 | 왼쪽에서 오른쪽으로 |
8 | == != |
등식/불등식 | 왼쪽에서 오른쪽으로 |
12 | && |
논리곱 | 왼쪽에서 오른쪽으로 |
13 | ^^ |
논리 XOR | 왼쪽에서 오른쪽으로 |
14 | || |
논리합 | 왼쪽에서 오른쪽으로 |
15 | ?\:
|
선택 (하나의 전체 피연산자) | 왼쪽에서 오른쪽으로 |
16 | = += -= *= /=
|
할당 산술 할당 산술 할당 | 왼쪽에서 오른쪽으로 |
17 | , |
시퀀스 | 왼쪽에서 오른쪽으로 |
행렬 및 벡터 연산
산술 연산자는 스칼라 값에 적용하면 스칼라가 됩니다. 모듈로 이외의 연산자의 경우 한 피연산자가 스칼라이고 다른 피연산자가 벡터 또는 행렬인 경우 연산이 구성요소별로 실행되며 동일한 벡터 또는 행렬 유형이 결과로 나옵니다. 두 연산이 모두 동일한 크기의 벡터인 경우 연산은 구성요소별로 실행되며 동일한 벡터 유형을 반환합니다.
작업 | 설명 |
---|---|
m = f * m |
스칼라 값을 사용한 구성요소별 행렬 곱셈 |
v = f * v |
스칼라 값으로 구성별 벡터 곱하기 |
v = v * v |
벡터 값으로 구성원별 벡터 곱하기 |
m = m + m |
행렬 구성요소별 덧셈 |
m = m - m |
행렬 구성요소별 뺄셈 |
m = m * m |
선형 대수 곱셈 |
한 피연산자가 행렬의 행 또는 열 크기와 일치하는 벡터인 경우 곱셈 연산자를 사용하여 대수학적 행 및 열 곱셈을 실행할 수 있습니다.
작업 | 설명 |
---|---|
m = v * m |
행 벡터 * 행렬 선형 대수 곱하기 |
m = m * v |
행렬 * 열 벡터 선형 대수 곱하기 |
벡터 내적, 외적, 구성요소별 곱셈에 기본 제공 함수를 사용합니다.
함수 | 설명 |
---|---|
f = dot(v, v) |
벡터 내적 |
v = cross(v, v) |
벡터 교차곱 |
m = matrixCompMult(m, m) |
구성요소별 곱셈 |
프로그램 제어
함수 호출 | 값 반환 호출 |
---|---|
반복 | for (<init>;<test>;<next>) { break, continue } |
선택 | if ( ) { } if ( ) { } else { } switch () { break, case }
- 기본 사례가 마지막에 표시됨 |
점프 | break, continue, return (삭제는 허용되지 않음) |
항목 | half4 main(float2 fragCoord) |
for 루프 제한사항
GLSL ES 1.0과 마찬가지로 'for' 루프는 매우 제한적입니다. 컴파일러는 루프를 펼칠 수 있어야 합니다. 즉, 모든 것을 컴파일 시 계산할 수 있도록 초기화자, 테스트 조건, next
문이 상수를 사용해야 합니다. next
문은 ++, --, +=, or -=
사용으로 제한됩니다.
내장 함수
GT
(일반 유형)은 float
, float2
, float3
, float4
또는 half
, half2
, half3
, half4
입니다.
이러한 함수의 대부분은 구성요소별로 작동합니다 (함수가 구성요소별로 적용됨). 그렇지 않은 경우에는 언급됩니다.
각 및 삼각함수
각도로 지정된 함수 매개변수는 라디안 단위로 간주됩니다. 이러한 함수로 인해 0으로 나누기 오류가 발생하는 경우는 없습니다. 비율의 분모가 0이면 결과가 정의되지 않습니다.
함수 | 설명 |
---|---|
GT radians(GT degrees) |
도 단위를 라디안으로 변환합니다. |
GT degrees(GT radians) |
라디안을 각도로 변환합니다. |
GT sin(GT angle) |
표준 사인 |
GT cos(GT angle) |
표준 코사인 |
GT tan(GT angle) |
표준 접선 |
GT asin(GT x)
|
$ \left[-{\pi\over 2},{\pi\over 2}\right] $ 범위에서 사인이 x인 각도를 반환합니다. |
GT acos(GT x)
|
$ \left[0,\pi\right] $ 범위에서 코사인이 x인 각도를 반환합니다. |
GT atan(GT y, GT x)
|
$ \left[-\pi,\pi\right] $ 범위에서 삼각함수 아르키탄젠트가 $ \left[{y\over x}\right] $인 각도를 반환합니다. |
GT atan(GT y_over_x)
|
$ \left[-{\pi\over 2},{\pi\over 2}\right] $ 범위에서 삼각함수 아르키탄젠트가 y_over_x 인 각도를 반환합니다. |
지수 함수
함수 | 설명 |
---|---|
GT pow(GT x, GT y) |
$ x^y $를 반환합니다. |
GT exp(GT x) |
$ e^x $를 반환합니다. |
GT log(GT x) |
$ ln(x) $를 반환합니다. |
GT exp2(GT x) |
$ 2^x $를 반환합니다. |
GT log2(GT x) |
$ log_2(x) $를 반환합니다. |
GT sqrt(GT x) |
$ \sqrt{x} $를 반환합니다. |
GT inversesqrt(GT x) |
$ 1\over{\sqrt{x}} $를 반환합니다. |
일반적인 함수
함수 | 설명 |
---|---|
GT abs(GT x) |
절댓값 |
GT sign(GT x) |
x의 부호에 따라 -1.0, 0.0 또는 1.0을 반환합니다. |
GT floor(GT x) |
x보다 작은 가장 가까운 정수 |
GT ceil(GT x) |
x보다 크거나 같은 가장 가까운 정수 |
GT fract(GT x) |
x의 소수 부분을 반환합니다. |
GT mod(GT x, GT y) |
x의 y 배수를 반환합니다. |
GT mod(GT x, float y) |
x의 y 배수를 반환합니다. |
GT min(GT x, GT y) |
x 또는 y의 최솟값을 반환합니다. |
GT min(GT x, float y) |
x 또는 y의 최솟값을 반환합니다. |
GT max(GT x, GT y) |
x 또는 y의 최대값을 반환합니다. |
GT max(GT x, float y) |
x 또는 y의 최대값을 반환합니다. |
GT clamp(GT x, GT
minVal, GT maxVal) |
minVal과 maxVal 사이에서 제한된 x를 반환합니다. |
GT clamp(GT x, float
minVal, float maxVal) |
minVal과 maxVal 사이에서 제한된 x를 반환합니다. |
GT saturate(GT x) |
0.0과 1.0 사이로 제한된 x를 반환합니다. |
GT mix(GT x, GT y,
GT a) |
x와 y의 선형 혼합을 반환합니다. |
GT mix(GT x, GT y,
float a) |
x와 y의 선형 혼합을 반환합니다. |
GT step(GT edge, GT x) |
x < edge이면 0.0을, 그 외의 경우에는 1.0을 반환합니다. |
GT step(float edge,
GT x) |
x < edge면 0.0을 반환하고, 그 외의 경우에는 1.0을 반환합니다. |
GT smoothstep(GT edge0,
GT edge1, GT x) |
edge0 < x < edge1인 경우 0과 1 사이에서 Hermite 보간을 실행합니다. |
GT smoothstep(float
edge0, float edge1,
GT x) |
edge0 < x < edge1인 경우 0과 1 사이에서 Hermite 보간을 실행합니다. |
기하학 함수
이러한 함수는 구성요소별이 아닌 벡터로 벡터에서 작동합니다. GT는 크기가 2~4인 부동 소수점/하프 벡터입니다.
함수 | 설명 |
---|---|
float/half length
(GT x) |
벡터의 길이를 반환합니다. |
float/half distance(GT
p0, GT p1) |
지점 간의 거리를 반환합니다. |
float/half dot(GT x,
GT y) |
내적을 반환합니다. |
float3/half3
cross(float3/half3 x,
float3/half3 y) |
반환 크로스 프로덕트 |
GT normalize(GT x) |
벡터를 길이 1로 정규화 |
GT faceforward(GT N,
GT I, GT Nref) |
dot(Nref, I) < 0인 경우 N을 반환하고, 그렇지 않으면 -N을 반환합니다. |
GT reflect(GT I, GT N) |
반사 방향 I - 2 * dot(N,I) * N |
GT refract(GT I, GT N,
float/half eta) |
굴절 벡터를 반환합니다. |
행렬 함수
mat 유형은 정사각형 행렬 유형입니다.
함수 | 설명 |
---|---|
mat matrixCompMult(mat
x, mat y) |
x와 y를 구성요소별로 곱합니다. |
mat inverse(mat m) |
m의 역수를 반환합니다. |
벡터 관계 함수
x와 y를 구성요소별로 비교합니다. 특정 호출의 입력 벡터와 반환 벡터의 크기가 일치해야 합니다. T는 정수 벡터 유형과 부동 소수점 벡터 유형의 합집합입니다. BV는 입력 벡터의 크기와 일치하는 불리언 벡터입니다.
함수 | 설명 |
---|---|
BV lessThan(T x, T y) |
x < y |
BV lessThanEqual(T x,
T y) |
x <= y |
BV greaterThan(T x,
T y) |
x > y |
BV greaterThanEqual(T
x, T y) |
x >= y |
BV equal(T x, T y) |
x == y |
BV equal(BV x, BV y) |
x == y |
BV notEqual(T x, T y) |
x != y |
BV notEqual(BV x,
BV y) |
x != y |
bool any(BV x) |
x의 구성요소 중 하나가 true 인 경우 true |
bool all(BV x) |
x의 모든 구성요소가 true 인 경우 true 입니다. |
BV not(BV x) |
x의 논리 보조 항 |
색상 함수
함수 | 설명 |
---|---|
vec4 unpremul(vec4
color) |
색상 값을 사전 곱하지 않은 알파로 변환합니다. |
half3 toLinearSrgb(half3
color) |
선형 SRGB로의 색상 공간 변환 |
half3 fromLinearSrgb(half3
color) |
색상 공간 변환 |
셰이더 샘플링 (평가)
샘플러 유형은 지원되지 않지만 다른 셰이더는 평가할 수 있습니다. 텍스처를 샘플링해야 하는 경우 BitmapShader 객체를 만들고 이를 유니폼으로 추가할 수 있습니다. 이는 모든 셰이더에 적용할 수 있으므로 다른 RuntimeShader 객체를 포함하여 Android 셰이더를 먼저 비트맵으로 변환하지 않고도 직접 평가할 수 있습니다. 이렇게 하면 유연성이 크게 향상되지만 복잡한 셰이더는 특히 루프에서 평가하는 데 비용이 많이 들 수 있습니다.
uniform shader image;
image.eval(coord).a // The alpha channel from the evaluated image shader
원시 버퍼 샘플링
대부분의 이미지에는 색상 관리가 필요한 색상이 포함되어 있지만, 일부 이미지에는 노멀, 재료 속성 (예: 거칠기), 높이 맵 또는 이미지에 저장된 순수한 수학적 데이터를 포함하여 실제로 색상이 아닌 데이터가 포함되어 있습니다. AGSL에서 이러한 유형의 이미지를 사용할 때는 RuntimeShader#setInputBuffer를 사용하여 BitmapShader를 일반 원시 버퍼로 사용할 수 있습니다. 이렇게 하면 색상 공간 변환과 필터링이 방지됩니다.