AGSL 빠른 참조

AGSL은 GLSL ES 1.0과 대부분 호환되도록 설계되었습니다. 자세한 내용은 OpenGL ES 셰이딩 언어 문서에서 상응하는 함수를 참고하세요. 이 문서에서는 가능한 경우 AGSL과 GLSL의 차이점을 설명합니다.

유형

AGSL은 GLSL ES 1.0 유형과 벡터 및 행렬 유형을 나타내는 추가 방법을 지원합니다. AGSL은 중간 정밀도를 나타내는 추가 shorthalf 유형을 지원합니다.

기본 유형

유형 설명
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 범위를 갖습니다. 정밀도 수정자는 스칼라, 벡터, 행렬 변수 및 매개변수에 적용할 수 있습니다. 아래에 나열된 최솟값만 보장됩니다. lowpmediump보다 실제로 정밀도가 낮을 필요는 없으며 mediumphighp보다 정밀도가 낮을 필요는 없습니다. 현재 AGSL은 최종 출력에서 lowpmediump로 변환합니다.

수정자 '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, setInputShaderRuntimeShader 메서드를 사용하여 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를 일반 원시 버퍼로 사용할 수 있습니다. 이렇게 하면 색상 공간 변환과 필터링이 방지됩니다.