WebGPU rgba32float 블렌딩 오류: 장치 생성 때 켜야 할 기능
adapter.features에는 float32-blendable이 있는데, 렌더러는 rgba32float를 블렌딩할 수 없다고 오류를 낸다. 지원한다는 기능이 왜 실제 장치에서는 꺼져 있을까?

- r32float·rg32float·rgba32float의 블렌딩에는 float32-blendable이 필요하다.
- adapter.features로 지원을 확인하고 requestDevice의 requiredFeatures로 요청한다.
- 필터링 기능을 켜거나 브라우저만 업데이트해도 자동으로 활성화되지는 않는다.
지원하는 GPU인데도 블렌딩이 막힐 수 있다
렌더 타깃을 rgba32float로 바꾼 뒤 ‘블렌딩할 수 없는 포맷’이라는 검증 오류가 나면 장치 생성 코드를 확인해야 한다. float32-blendable은 r32float·rg32float·rgba32float의 블렌딩을 허용하는 선택 기능이다.
여기에는 두 단계가 있다. adapter.features는 현재 환경에서 요청할 수 있는 기능을 알려 준다. 실제 작업에 쓰는 device.features에는 장치를 만들 때 요청한 기능만 들어간다. 지원 여부가 true여도 요청을 빠뜨렸다면 해당 장치의 파이프라인에서는 쓸 수 없다.
따라서 이미 얻은 device를 사용 중인 앱에서는 device.features.has("float32-blendable")도 확인한다. 다른 장치를 새로 만들어 기능을 켠 뒤 기존 렌더러가 그대로 바뀔 것이라고 기대해서는 안 된다.
장치를 만들 때 requiredFeatures에 넣는다
다음은 직접 GPUDevice를 만드는 앱의 초기화 예다. WebGPU 자체, 어댑터, 선택 기능 순서로 확인하고 지원될 때만 장치를 요청한다. 반환된 장치를 이후 텍스처와 파이프라인 생성에 사용한다.
async function createFloatBlendDevice() {
if (!navigator.gpu) {
throw new Error("WebGPU is unavailable");
}
const adapter = await navigator.gpu.requestAdapter();
if (!adapter) {
throw new Error("No WebGPU adapter");
}
const feature = "float32-blendable";
if (!adapter.features.has(feature)) {
throw new Error("32-bit float blending is unavailable");
}
return adapter.requestDevice({ requiredFeatures: [feature] });
} requiredFeatures의 기본값은 빈 배열이다. 미지원 기능을 무조건 넣으면 요청이 거부되며 TypeError가 발생한다. 예제의 오류는 호출부에서 받아 해당 렌더링 모드를 제공하지 않는 안내나 다른 렌더링 경로로 연결한다.
이 함수가 화면까지 그려 주는 것은 아니다. 실제 파이프라인에서는 대상 포맷과 fragment.targets의 blend 설정도 맞아야 한다. 프레임워크가 장치를 만드는 앱이라면 위 함수를 따로 실행하기보다 그 프레임워크의 장치 초기화 경로에서 같은 기능이 요청되는지 살펴야 한다.
float32-filterable은 다른 작업을 허용한다
이름이 비슷한 float32-filterable을 켰다고 블렌딩 오류가 해결되지는 않는다. 필터링 기능은 32비트 부동소수점 텍스처를 샘플러로 읽을 때의 필터링을 허용한다. 블렌딩은 프래그먼트의 출력과 렌더 타깃에 있는 값을 결합하는 단계다.
| 하려는 작업 | 확인할 기능 |
|---|---|
| 32비트 float 텍스처를 필터링해 읽는다. | float32-filterable |
| 32비트 float 렌더 타깃에 블렌딩한다. | float32-blendable |
지원 기능 목록에서도 두 항목은 분리돼 있다. 한 렌더러가 둘 다 필요로 한다면 각각 지원 여부와 장치 요청을 확인해야 한다.
오류가 난 출력에 블렌딩이 필요한지도 확인한다
장치 기능이 맞는데도 문제가 이어지면 렌더 파이프라인의 각 출력 타깃을 본다. 색상과 법선 같은 여러 데이터를 다른 타깃에 쓰는 앱에서는 색상 합성에 필요한 설정이 다른 데이터 출력에도 붙어 있는지 살펴볼 수 있다.
- 어댑터에 기능이 없다면 해당 환경에서 이 32비트 블렌딩 경로를 사용할 수 없다.
- 어댑터에는 있지만 장치에 없다면 실제 렌더러의 장치 생성 요청을 고쳐야 한다.
- 원래 합성할 필요가 없는 출력이라면 그 타깃에 blend를 지정할 이유부터 다시 판단한다.
오류를 없애려고 blend를 지우는 것은 합성 결과를 유지하는 수정이 아니다. 기존 값과 섞어야 하는 투명 색상 출력에서 블렌딩을 빼면 렌더링 의미가 달라진다. 필요한 기능을 요청할지, 블렌딩하지 않는 출력으로 설계할지는 데이터의 용도로 결정해야 한다.
Firefox 158도 float32-blendable 지원을 추가했다. 다만 브라우저 버전만으로 개별 GPU 환경의 지원을 보장하지는 않는다. 초기화 시점의 지원 확인과 장치 요청을 코드에 남겨야 같은 앱이 다른 컴퓨터에서 실행될 때도 원인을 구분할 수 있다.