AGSL 빠른 참조

AGSL은 GLSL ES 1.0과 대부분 호환되도록 설계되었습니다. 자세한 내용은 OpenGL ES Shading Language 문서에서 동등한 함수를 참고하세요. 이 문서에서는 가능한 경우 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의 부호 있는 정수/벡터와 같음
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보다 낮은 정밀도는 아니며, mediumphighp보다 반드시 낮은 정밀도는 아닙니다. AGSL은 현재 최종 출력에서 lowpmediump로 변환합니다.

수정자 '부동 소수점 수' 범위 '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, 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 () 괄호로 묶인 그룹 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를 일반 원시 버퍼로 사용할 수 있습니다. 이렇게 하면 색상 공간 변환 및 필터링을 방지할 수 있습니다.