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 행렬 유형과 동일합니다.

정밀도 및 범위 최솟값

각 예측 값과 관련된 최소 보장 정밀도 및 범위입니다. 특수키를 사용합니다. 대부분의 기기 ES 3.0을 지원하는 경우 더 높은 highp 정밀도/범위를 얻고 int mediump 범위. 정밀도 수정자는 스칼라, 벡터, 행렬 변수와 매개변수를 학습합니다. 아래에 나열된 최소 금액만 보장됩니다. lowp의 정밀도가 mediump보다 실제로 낮을 필요는 없습니다. mediump highp보다 정밀도가 반드시 낮은 것은 아닙니다. AGSL의 현재 전환율은 lowp입니다. 최종 출력에서 mediump로 변경합니다.

수정자 '부동 소수점 수' 범위 '부동 소수점 수' 규모 범위 '부동 소수점 수' 정밀도 '정수' 범위
높음 \(\left\{-2^{62},2^{62}\right\}\) \(\left\{2^{-62},2^{62}\right\}\) 상대적: \(2^{-16}\) \(\left\{-2^{16},2^{16}\right\}\)
MPP \(\left\{-2^{14},2^{14}\right\}\) \(\left\{2^{-14},2^{14}\right\}\) 상대적: \(2^{-10}\) \(\left\{-2^{10},2^{10}\right\}\)
최저 \(\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.

명시적 배열 크기로는 1차원 배열만 지원되며, C 스타일 또는 GLSL 스타일 문법 중 하나입니다.

<base type>[<array size>] 변수 이름 - 예: half[10] x;

<기본 유형> 변수 이름[<array size>] - 예: half x[10];

배열은 함수에서 반환되거나 복사, 할당 또는 비교될 수 없습니다. 배열 제한은 배열이 포함된 구조체에 전파됩니다. 배열은 상수 또는 루프 변수를 통해서만 색인을 생성할 수 있습니다.

예선

유형 설명
const 컴파일 시간 상수 또는 읽기 전용 함수 매개변수 값으로 사용됩니다.
uniform 프리미티브에서 값이 변경되지 않음 있습니다. 유니폼은 다음을 사용하여 Android에서 전달됩니다. RuntimeShader setColorUniform, setFloatUniform, setIntUniform, setInputBuffer, setInputShader
in 전달된 함수 매개변수용입니다. 이는 기본값입니다.
out 전달된 함수 매개변수입니다. 필수 사용 정밀도는 함수 정의와 같습니다.
inout 안팎으로 전달되는 매개변수의 경우 함수입니다. 다음과 같은 정밀도를 사용해야 합니다. 함수 정의입니다.

변수 선언

선언은 명시적인 중괄호 범위 내에 있어야 합니다. y 선언은 다음 샘플은 허용되지 않습니다.

if (condition)
    int y = 0;

행렬/구조/배열 기본사항

행렬 생성자 예

행렬이 단일 값으로 구성되면 모든 값은 대각선에는 그 값이 지정되고 나머지에는 0이 지정됩니다. float2x2(1.0) 권한 2x2 단위 행렬을 만듭니다.

행렬이 여러 값으로 구성되면 열이 먼저 채워집니다. (열-주순).

GLSL과 달리 생성자는 전달된 벡터는 지원되지 않지만 재구성을 사용하여 동일한 있습니다. 다음과 동일한 동작으로 AGSL의 vec4에서 vec3를 구성합니다. GLSL인 경우 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 || 논리합(OR) 왼쪽에서 오른쪽으로
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) 사인이 범위에서 x인 각도를 반환합니다. /$ \left[-{\pi\over 2},{\pi\over 2}\right] $
GT acos(GT x) 다음에서 코사인이 x인 각도를 반환합니다. 범위 $ \left[0,\pi\right] $
GT atan(GT y, GT x) 다음과 같은 각도를 반환합니다. 삼각 아크탄젠트 다음에서 $ \left[{y\over x}\right] $ 입니다. 범위 $ \left[-\pi,\pi\right] $
GT atan(GT y_over_x) 삼각함수가 아크탄젠트가 범위 내 y_over_x임 /$ \left[-{\pi\over 2},{\pi\over 2}\right] $

지수 함수

함수 설명
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가 < 이면 0.0을 반환합니다. 에지, 그 외 1.0
GT step(float edge, GT x) x가 < 이면 0.0을 반환합니다. 에지, 그 외 1.0
GT smoothstep(GT edge0, GT edge1, GT x) 허미트 보간 수행 Edge0 <인 경우 0에서 1 사이 x < 에지1
GT smoothstep(float edge0, float edge1, GT x) 허미트 보간 수행 Edge0 <인 경우 0에서 1 사이 x < 에지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) <인 경우 N을 반환합니다. 0이고, 그렇지 않으면 -N입니다.
GT reflect(GT I, GT N) 반사 방향 I - 2 * 점(N,I) * N입니다.
GT refract(GT I, GT N, float/half eta) 굴절 벡터를 반환합니다.

행렬 함수

매트 유형은 모든 정사각형 행렬 유형입니다.

함수 설명
mat matrixCompMult(mat x, mat y) 구성요소별로 x에 y 곱하기
mat inverse(mat m) m의 역을 반환합니다.

벡터 관계형 함수

x와 y를 구성요소별로 비교합니다. 특정 호출에 대한 입력 및 반환 벡터의 크기가 일치해야 합니다. T는 정수와 부동 소수점 벡터 유형의 합집합입니다. BV는 입력 벡터의 크기와 일치하는 불리언 벡터입니다.

함수 설명
BV lessThan(T x, T y) x < 년
BV lessThanEqual(T x, T y) x <= y
BV greaterThan(T x, T y) x > 년
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 객체를 열고 있습니다. 모든 셰이더에 이 작업을 실행할 수 있습니다. 즉, 모든 Android 셰이더를 Bitmap을 사용해야 하며, RuntimeShader 객체. 이렇게 하면 엄청난 유연성이 필요하지만 복잡한 셰이더는 특히 루프에서 평가합니다

uniform shader image;

image.eval(coord).a   // The alpha channel from the evaluated image shader

원시 버퍼 샘플링

대부분의 이미지에는 색상 관리가 필요한 색상이 포함되어 있지만 일부 이미지에는 실제로 색상이 아닌 데이터를 포함하는데, 여기에는 일반을 저장하는 이미지, 머티리얼 속성 (예: 거칠기), 높이맵 또는 기타 순수한 이미지에 저장되는 수학적 데이터를 말합니다. 이러한 종류의 이미지를 생성할 때 BitmapShader를 일반 원시 버퍼로 사용할 수 있습니다. RuntimeShader#setInputBuffer를 살펴봅니다. 이렇게 하면 색상 공간 변환 및 필터링을 피할 수 있습니다.