three.js, 후처리 적용시 …

후처리가 적용되면 GPU 단계에서 적용되는 안티알리아싱(MSAA) 기능이 제대로 작동하지 않습니다. 즉, 다음 옵션은 불필요한 GPU 연산을 유발합니다.

const renderer = new THREE.WebGPURenderer({
    canvas: canvas,
    antialias: true // 이 옵션!
});

GPU가 해주던 안티알리아싱의 대안으로 후처리가 대신해줘야 하는데요. 다음처럼 FXAA 알고리즘을 사용하는 노드를 통해 처리가 가능합니다.

import { fxaa } from 'three/examples/jsm/tsl/display/FXAANode.js'


...

const fxaaPass = fxaa(renderPipeline.outputNode);
renderPipeline.outputNode = fxaaPass;

그런데, 꼼꼼한 개발자라면 색상에 대한 선형값을 우리의 눈에 익숙한 비선형값으로 변환해주는 처리가 안티알리아싱이 적용되기 직전에 수행되도록 해주는 것이 자연스럽습니다. 기본값은 안티알리아싱이 처리된 이후 색상 변환이 작동되거든요.

이를 위해 먼저 색상값을 화면에 표시할때 색상 변환이 작동하지 않도록 해줘야 합니다. 다음처럼요.

const renderPipeline = new THREE.RenderPipeline(renderer)
renderPipeline.outputColorTransform = false;

그리고 FXAA 방식의 안티알리아싱이 적용되기 직전의 렌더링 파이프라인에 다음 코드를 추가합니다.

import { ..., renderOutput } from 'three/tsl'

...

// Color transform pass
renderPipeline.outputNode = renderOutput(renderPipeline.outputNode);

const fxaaPass = fxaa(renderPipeline.outputNode)
...

renderOutput는 렌더러의 toneMapping 속성과 toneMappingExposure 속성을 처리해주는 노드입니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다