0610 셰이더에 모델 내장
260610
video2x 라는 프로그램을 써 보다가
충격적인 걸 보았다.
models 라는 폴더 안에
libplacebo 라는 모델이 있는데,
여기 안에 있는 모델은 전부
GLSL로 작성되어 있다.
충격적인 점이 한둘이 아니다.
첫 번째로
1300 KB 크기의 셰이더가 있고
가장 작은 셰이더가 1400줄이라는 점.
두 번째로,
아마 GLSLS 표준 상에서
전역 변수 크기에 제한이 있었는지는 모르겠는데,
vec4 _Kernel0[1024] = vec4[1024] (
...
);
이렇게 된 게 아니라,
전부 mat4의 덧셈으로 나타내져 있다는 것이다.
밑에는 anime4k-v4-c.glsl 의 일부를 추출한 것이다.
//!DESC Anime4K-v3.2-Upscale-Denoise-CNN-x2-(VL)-Conv-4x3x3x3
//!HOOK MAIN
//!BIND MAIN
//!SAVE conv2d_tf1
//!WIDTH MAIN.w
//!HEIGHT MAIN.h
//!COMPONENTS 4
//!WHEN OUTPUT.w MAIN.w / 1.200 > OUTPUT.h MAIN.h / 1.200 > *
#define go_0(x_off, y_off) (MAIN_texOff(vec2(x_off, y_off)))
vec4 hook() {
vec4 result = mat4(-0.012326053, 0.050769784, 0.1278702, -0.100782245, 0.14329414, -0.054558773, 0.023473471, 0.056829426, 0.048292916, 0.0046510273, -0.11478287, 0.0011030561, 0.0, 0.0, 0.0, 0.0) * go_0(-1.0, -1.0);
result += mat4(0.29542983, -0.55061895, -0.068554066, 0.1433222, -0.072878316, 0.30201668, -0.2223378, -0.06704077, 0.16955832, 0.3279914, 0.17619601, -0.1276919, 0.0, 0.0, 0.0, 0.0) * go_0(-1.0, 0.0);
그렇게까지 논리에 맞지 않는 방법은 아니다.
근데 이게 이미지 업스케일러로 알고 있는데
이 정도 데이터로도 돌아가는 게 신기하다.