AGSL과 GLSL의 차이

AGSL과 GLSL은 문법이 매우 유사하여 많은 GLSL 프래그먼트 셰이더를 허용합니다. Android에 가져올 수 있는 새로운 효과를 얻었습니다. AGSL로 GLSL 수정 GLSL ES 1.0 (OpenGL ES 2.0에서 사용하는 셰이딩 언어)에서 설정된 기능을 최대 기기 도달범위를 제공합니다.

GLSL 프래그먼트 셰이더는 래스터라이저와 블렌딩 하드웨어가 있습니다. 이 셰이더는 생성된 색상은 블렌딩 단계에 피드되는 것과 정확히 일치합니다. 살펴봤습니다 AGSL에서 셰이더를 작성할 때는 살펴보겠습니다 이러한 언어 차이는 대부분 여기에서 비롯됩니다.

셰이더 실행

GLSL 셰이더에서와 마찬가지로 AGSL 셰이더는 main 함수에서 실행을 시작합니다. GLSL과 달리 이 함수는 'local'에서 셰이더 위치를 가져옵니다. 좌표를 매개변수 값으로 사용됩니다. 이는 gl_FragCoord와 유사하지만 프레임 버퍼가 아닙니다. 좌표의 경우 이 좌표는 셰이더. 그러면 셰이더가 픽셀 색상을 중형 또는vec4 높은 정밀도 (GLSL의 out vec4 color 또는 gl_FragColor와 유사)

mediump vec4 main(in vec2 fragCoord)

좌표 공간

GLSL과 AGSL 좌표 공간 비교

GLSL을 사용하여 그린 셰이더와 AGSL을 사용하여 거의 동일한 셰이더 그린

AGSL과 GLSL은 기본적으로 다른 좌표 공간을 사용합니다. GLSL에서 프래그먼트는 좌표 (fragCoord)는 왼쪽 하단을 기준으로 합니다. AGSL이 화면과 일치 캔버스의 좌표계 즉, Y축이 왼쪽 상단 모서리에서 시작합니다. 필요한 경우 해상도를 균일하게 전달하여 이 두 공간 간에 변환할 수 있습니다. Y축 값으로 resolution.y - fragCoord.y를 사용합니다. 또는 셰이더에 로컬 변환 행렬을 적용할 수 있습니다.

// AGSL to GLSL coordinate space transformation matrix
val localMatrix = Matrix()
localMatrix.postScale(1.0f, -1.0f)
localMatrix.postTranslate(0.0f, viewHeight)
gridShader.setLocalMatrix(localMatrix)

정밀도 및 유형

GLSL 호환 정밀도 수정자는 지원되지만 AGSL은 중간 정밀도도 나타내는 halfshort 유형.

벡터 유형은 이름이 지정된 <base type><columns>로 선언할 수 있습니다. 이때 vec2 대신 float2, bvec4 대신 bool4. 행렬 유형은 이름이 지정된 <base type><columns>x<rows>로 선언될 수 있으므로 mat3 대신 float3x3 AGSL은 GLSL 스타일 선언도 허용함 matvec의 경우 이러한 유형은 부동 소수점 수에 매핑됩니다. 상응합니다.

전처리기

AGSL은 GLSL 스타일을 지원하지 않습니다. 전처리기 지시어를 사용할 수 있습니다. #define 문을 const 변수로 변환합니다. AGSL의 컴파일러 const 변수에 대해 일정한 폴딩과 브랜치 제거를 지원하므로 효율적으로 사용할 수 있습니다

색상 공간

Android 애플리케이션은 색상을 관리합니다. 캔버스의 색상 공간은 사용할 수 있습니다. 소스 콘텐츠 (예: 셰이더, BitmapShader 확장) 색상 공간도 있습니다.

물리적으로 정확한 조명과 같은 특정 효과의 경우 계산을 해야 합니다. 선형 색 공간에서 표현됩니다. 이를 위해 AGSL은 함수:

half3 toLinearSrgb(half3 color)
half3 fromLinearSrgb(half3 color)

이는 작업 색공간과 Android의 LINEAR_EXTENDED_SRGB 드림 색 공간을 뜻합니다. 이 공간은 sRGB 원색 (색 영역)과 전송합니다. 확장된 입력 이미지를 사용하여 sRGB 영역 밖의 값을 나타냅니다. 0.0 미만 및 1.0 초과).

유니폼

AGSL은 유니폼에 색상이 포함되어 있는지 알 수 없으므로 자동으로 적용되지 않습니다. 알 수 있습니다. 다음 라벨을 사용하여 half4/float4/vec4에 라벨을 지정할 수 있습니다. layout(color): Android에 유니폼이 Android에서 균일 값을 작업 색으로 변환할 수 있습니다. 있습니다.

AGSL에서 유니폼을 다음과 같이 선언합니다.

layout(color) uniform half4 iColor;  // Input color
uniform float2 iResolution;          // Viewport resolution (pixels)

그러면 Android 코드에서 다음과 같이 유니폼을 설정할 수 있습니다.

shader.setColorUniform("iColor", Color.GREEN)
shader.setFloatUniform("iResolution", canvas.width.toFloat(), canvas.height.toFloat())