AGSL은 GLSL ES 1.0과 대부분 호환되도록 설계되었습니다. 자세한 내용은 OpenGL ES Shading Language 문서에서 동등한 함수를 참고하세요. 이 문서에서는 가능한 경우 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 의 부호 있는 정수/벡터와 같음 |
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' 정밀도 | '정수' 범위 |
---|---|---|---|---|
고음 | \(\left\{-2^{62},2^{62}\right\}\) | \(\left\{2^{-62},2^{62}\right\}\) | 친척: \(2^{-16}\) | \(\left\{-2^{16},2^{16}\right\}\) |
보통 | \(\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 유형>[<배열 크기>] 변수 이름 - 예: 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 | () |
괄호로 묶인 그룹 | N/A |
2 | [] () . ++ --
|
배열 아래 첨자 함수 호출 및 생성자 구조 필드 또는 메서드 선택기, 재구성 접미사 증가 및 감소 | 왼쪽에서 오른쪽으로 |
3 | ++ -- + - !
|
증가/감소 단항 | 오른쪽에서 왼쪽으로 |
4 | * / |
곱셈과 나눗셈 | 왼쪽에서 오른쪽으로 |
5 | + - |
더하기 및 빼기 | 왼쪽에서 오른쪽으로 |
7 | < > <= >= |
관계형 | 왼쪽에서 오른쪽으로 |
8 | == != |
같음/부등식 | 왼쪽에서 오른쪽으로 |
12 | && |
논리곱(AND) | 왼쪽에서 오른쪽으로 |
13 | ^^ |
논리 XOR | 왼쪽에서 오른쪽으로 |
14 | || |
논리합 | 왼쪽에서 오른쪽으로 |
15 | ?\:
|
선택 (전체 피연산자 1개) | 왼쪽에서 오른쪽으로 |
16 | = += -= *= /=
|
대입 산술 대입 산술 대입 | 왼쪽에서 오른쪽으로 |
17 | , |
sequence | 왼쪽에서 오른쪽으로 |
행렬 및 벡터 연산
스칼라 값에 적용하면 산술 연산자가 스칼라가 됩니다. 모듈로 이외의 연산자의 경우 한 피연산자가 스칼라이고 다른 피연산자가 벡터 또는 행렬이면 연산이 구성요소별로 수행되어 동일한 벡터 또는 행렬 유형이 생성됩니다. 두 연산이 동일한 크기의 벡터인 경우 작업은 구성요소별로 실행되어 동일한 벡터 유형을 반환합니다.
작업 | 설명 |
---|---|
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 사이의 허미트 보간을 실행합니다. |
GT smoothstep(float
edge0, float edge1,
GT x) |
Edge0 < x <edge1일 때 0과 1 사이의 허미트 보간을 실행합니다. |
기하 함수
이러한 함수는 구성요소 기준이 아닌 벡터로 벡터에서 작동합니다. 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) |
점(Nref, I) < 0이면 N을 반환하고 그렇지 않으면 -N을 반환합니다. |
GT reflect(GT I, GT N) |
반사 방향 I - 2 * 점(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를 일반 원시 버퍼로 사용할 수 있습니다. 이렇게 하면 색상 공간 변환 및 필터링을 방지할 수 있습니다.