변위 맵

Displacement Map

별도 맵 레이어의 색 정보를 읽어 입력 이미지를 위치별로 밀고 당깁니다.

다른 이름: DisplacementMapDisplacement mapping

WebGPU 를 지원하는 브라우저에서 움직입니다

이 기기에서는 데모를 그리지 못해 정지 화면을 보여 줍니다

React
// WebGPU 를 지원하는 브라우저에서만 그립니다.
// /samples/… 는 이 사이트의 샘플 파일입니다. 내 프로젝트의 이미지·영상 경로로 바꾸세요.
import {
  Shader,
  DisplacementMap,
  ImageTexture,
  SimplexNoise,
} from 'shaders/react'

export default function ShaderEffect() {
  return (
    <Shader style={{ width: '100%', height: 320 }} disableTelemetry>
      <ImageTexture
        objectFit="cover"
        url="/samples/poster.jpg" />
      <SimplexNoise
        id="displacement-source"
        visible={false} />
      <DisplacementMap
        amount={0.08}
        source="displacement-source" />
    </Shader>
  )
}
Vue
<!-- WebGPU 를 지원하는 브라우저에서만 그립니다. -->
<!-- /samples/… 는 이 사이트의 샘플 파일입니다. 내 프로젝트의 이미지·영상 경로로 바꾸세요. -->
<script setup lang="ts">
import {
  Shader,
  DisplacementMap,
  ImageTexture,
  SimplexNoise
} from 'shaders/vue'
</script>

<template>
  <Shader style="width: 100%; height: 320px" :disable-telemetry="true">
    <ImageTexture
      object-fit="cover"
      url="/samples/poster.jpg"/>
    <SimplexNoise
      id="displacement-source"
      :visible="false"/>
    <DisplacementMap
      :amount="0.08"
      source="displacement-source"/>
  </Shader>
</template>
Svelte
<!-- WebGPU 를 지원하는 브라우저에서만 그립니다. -->
<!-- /samples/… 는 이 사이트의 샘플 파일입니다. 내 프로젝트의 이미지·영상 경로로 바꾸세요. -->
<script>
  import {
    Shader,
    DisplacementMap,
    ImageTexture,
    SimplexNoise,
  } from 'shaders/svelte'
</script>

<Shader style="width: 100%; height: 320px" disableTelemetry>
  <ImageTexture
    objectFit="cover"
    url="/samples/poster.jpg" />
  <SimplexNoise
    id="displacement-source"
    visible={false} />
  <DisplacementMap
    amount={0.08}
    source="displacement-source" />
</Shader>
Solid
// WebGPU 를 지원하는 브라우저에서만 그립니다.
// /samples/… 는 이 사이트의 샘플 파일입니다. 내 프로젝트의 이미지·영상 경로로 바꾸세요.
import {
  Shader,
  DisplacementMap,
  ImageTexture,
  SimplexNoise,
} from 'shaders/solid'

export default function ShaderEffect() {
  return (
    <Shader style={{ width: '100%', height: '320px' }} disableTelemetry>
      <ImageTexture
        objectFit="cover"
        url="/samples/poster.jpg" />
      <SimplexNoise
        id="displacement-source"
        visible={false} />
      <DisplacementMap
        amount={0.08}
        source="displacement-source" />
    </Shader>
  )
}
JavaScript
// WebGPU 를 지원하는 브라우저에서만 그립니다.
// /samples/… 는 이 사이트의 샘플 파일입니다. 내 프로젝트의 이미지·영상 경로로 바꾸세요.
// <canvas id="canvas" style="width:100%;height:320px"></canvas> 가 페이지에 있어야 한다
import { createShader } from 'shaders/js'

const shader = await createShader(document.getElementById("canvas"), {
  components: [
    {
      type: 'ImageTexture',
      props: {
        objectFit: 'cover',
        url: '/samples/poster.jpg',
      },
    },
    {
      type: 'SimplexNoise',
      id: 'displacement-source',
      props: {
        visible: false,
      },
    },
    {
      type: 'DisplacementMap',
      props: {
        amount: 0.08,
        source: 'displacement-source',
      },
    }
  ]
}, { disableTelemetry: true })

속성(props) · DisplacementMap

값을 바꾸면 위 데모와 코드 탭에 바로 반영됩니다. 설명은 라이브러리 레지스트리의 영어 원문(MIT)입니다.

이름값기본값범위·선택지설명(원문)
sourceSource Layer코드에서 지정—The layer whose pixels drive the displacement — its red/green (or luminance) push the content around
amountAmount0.30 – 1 (step 0.01)Overall displacement strength
channelModeChannelstwoAxistwoAxis · directionalHow the source drives the push — red→X / green→Y, or luminance along a fixed angle
angleAngle00 – 360 (step 1)Push direction in degrees (used by the Luminance channel mode)
edgesEdgesmirrorstretch · transparent · mirror · wrapHow to handle edges when distortion pushes content out of bounds

모든 컴포넌트 공통: blendMode · opacity · visible · maskSource/maskType · boundingBox · id

울퉁불퉁한 투명 필름을 이미지 위에 놓은 것처럼, 맵 레이어의 밝기와 색에 따라 입력 내용이 부분마다 다르게 밀립니다.

`source`에서 변형을 이끌 맵 레이어를 고르고 `amount`로 전체 변위량을 조절합니다. `channelMode`는 빨강·초록 채널로 가로·세로를 각각 움직일지 밝기 기준으로 한 방향으로 밀지 선택하며, 후자의 방향은 `angle`로 정합니다.

왜곡할 입력과 맵으로 쓸 레이어가 모두 있어야 차이가 보입니다. 맵을 선택하지 않으면 원본처럼 통과할 수 있습니다. `edges`에서 경계 처리를 정하고 `WaveDistortion`이나 `FlowField`와 함께 쓰면 파동·유체 느낌의 변형을 만들 수 있습니다.

언제 쓰나

물결·열기 굴절, 종이 질감, 이미지의 국소적인 흔들림을 만들 때 유용합니다. 변위 맵을 지정하지 않았거나 문구가 선명해야 하는 상황에는 피하세요.

페이지로 열기 ↗