☰ 분류

불씨와 재 환경효과 프롬프트

다크 판타지 3D 랜딩 페이지 조건을 넣으면 불씨, 재, 연기, soft particle 셰이더, 빛 산란 효과 설계를 요청합니다.

분류개발 › 코딩
태그초안작성분석개발자코드
프롬프트 (영어 본문 · 답은 한국어로 옵니다)
I want you to act as a Technical Artist specializing in atmospheric 3D effects such as volumetric fog, falling embers, and localized weather systems.

Project Goal: Create a high-fidelity "Embers and Ash" environmental effect for a dark-fantasy 3D landing page.

Technical Logic:

Design a particle emitter that simulates the erratic, upward-floating movement of burning embers, including horizontal wind sway.

Implement "Size Over Life" and "Opacity Over Life" curves to ensure particles realistically flicker and vanish.

Use custom sprites with a "Soft Particle" shader to avoid harsh clipping when particles intersect with 3D geometry in the scene.

Add a secondary "Smoke" particle layer using low-frequency noise to simulate volumetric density.

Implement a "Light Scattering" effect where each ember acts as a tiny light source, subtly illuminating nearby meshes.

어떤 프롬프트인가

대기감 있는 3D 랜딩 페이지용 Embers and Ash 효과를 만드는 기술 아트 프롬프트다. 입자 수명에 따른 크기와 투명도 곡선, wind sway, 연기 레이어를 포함한다.

모델 비교

Gemini는 가장 구체적이고 완성도 높지만 장황하다. ChatGPT는 간결하고 실용적이나 깊이 처리 오류가 있으며, [C]는 답이 없다.

Gemini종합 1위
41/ 50

+ 요구 효과 전부를 셰이더 수준까지 구체화했다.

- 과도하게 길고 일부 성능 표현이 단정적이다.

ChatGPT
40/ 50

+ 실용적 수치와 품질 단계가 간결하고 명확하다.

- 비선형 깊이를 직접 빼는 Soft Fade가 부정확하다.

기준ChatGPTGemini앞선 모델
지시 준수89Gemini +13%
정확성68Gemini +33%
구체성810Gemini +25%
구성·가독성98ChatGPT +13%
분량 적정성96ChatGPT +50%

gpt-5.6-sol가 모델 이름을 가린 채 1~10점으로 채점했습니다 (2026-09-25). 측정값이 아니라 AI 심사 결과입니다.

답 전문 보기

같은 입력을 세 모델에 넣어 받은 답을 그대로 옮겼습니다. 각 CLI(에이전트 하네스)에서 실행했습니다. ChatGPT·Claude 앱이나 웹에서는 답이 다를 수 있습니다.

gpt-5.6-luna (codex CLI · 에이전트 하네스) · 실행일 2026-09-24

현재 워크스페이스는 읽기 전용이며 프로젝트 파일을 확인하거나 수정할 수 없어, 아래와 같이 구현 설계를 제안합니다.

Ember 시스템

각 파티클에 다음 속성을 부여합니다.

type Ember = {
  position: Vector3
  velocity: Vector3
  life: number
  maxLife: number
  seed: number
  size: number
}

이동식은 다음처럼 구성합니다.

// vertex shader 개념
float age = uTime - aSpawnTime;
float life01 = clamp(age / aLifetime, 0.0, 1.0);

vec3 wind;
wind.x = sin(uTime * 0.8 + aSeed * 12.4) * 0.35;
wind.z = cos(uTime * 0.55 + aSeed * 8.1) * 0.22;

// 상승력 + 불규칙한 난류
vec3 motion = vec3(
  wind.x,
  uRiseSpeed + sin(aSeed * 20.0 + uTime * 1.7) * 0.12,
  wind.z
);

transformed += motion * age;

권장 파라미터:

  • 상승 속도: 0.4 ~ 1.4
  • 수평 바람 세기: 0.15 ~ 0.5
  • 수명: 1.5 ~ 4.5초
  • 파티클 크기: 0.015 ~ 0.06
  • 발광 색상: #ffb347, #ff6a2a, #ffd27a

Size Over Life

입자 크기는 초기에 작게 시작하고, 중간에 커진 뒤 사라지도록 합니다.

float sizeCurve = smoothstep(0.0, 0.12, life01)
                * (1.0 - smoothstep(0.72, 1.0, life01));

gl_PointSize = aSize * sizeCurve * uPixelRatio;

Opacity Over Life 및 Flicker

float fadeIn  = smoothstep(0.0, 0.08, life01);
float fadeOut = 1.0 - smoothstep(0.65, 1.0, life01);

float flicker = 0.72
              + 0.28 * sin(uTime * 18.0 + aSeed * 31.0);

float alpha = fadeIn * fadeOut * flicker;

이렇게 하면 생성 직후 갑자기 나타나지 않고, 마지막에는 자연스럽게 꺼집니다.

Soft Particle 셰이더

깊이 텍스처와 현재 파티클 깊이를 비교해 지오메트리 교차 부분을 부드럽게 페이드합니다.

float sceneDepth = texture2D(uDepthTexture, vScreenUV).r;
float particleDepth = gl_FragCoord.z;

float depthFade = clamp(
  (sceneDepth - particleDepth) * uSoftness,
  0.0,
  1.0
);

vec4 sprite = texture2D(uEmberTexture, gl_PointCoord);
gl_FragColor = vec4(sprite.rgb * uEmberColor, sprite.a * vAlpha * depthFade);

렌더링 설정은 다음이 적합합니다.

material.transparent = true
material.depthWrite = false
material.blending = THREE.AdditiveBlending

단, 밝은 연기에는 NormalBlending을 사용하는 편이 더 자연스럽습니다.

Smoke 레이어

연기 입자는 별도의 낮은 밀도 레이어로 둡니다.

  • 엷은 회색-갈색 원형 텍스처
  • 큰 크기: 0.3 ~ 1.2
  • 느린 상승 속도
  • 낮은 불투명도: 0.025 ~ 0.12
  • 수명: 4 ~ 10초
  • NormalBlending
  • 저주파 3D/2D 노이즈로 가장자리와 밀도 변형
float noise = fbm(vWorldPosition * 0.7 + uTime * 0.025);
float density = smoothstep(0.35, 0.75, noise);

float smokeAlpha =
  density *
  smoothstep(0.0, 0.18, life01) *
  (1.0 - smoothstep(0.7, 1.0, life01)) *
  uSmokeOpacity;

연기에는 Additive Blending을 사용하지 않는 것이 좋습니다. 그렇지 않으면 어두운 판타지 분위기보다 밝은 안개처럼 보일 수 있습니다.

Light Scattering

각 불씨를 실제 광원으로 만들면 광원 수가 많아져 성능 문제가 발생하므로, 두 레이어를 조합합니다.

  1. 모든 불씨는 셰이더에서 자체 발광
  2. 가장 밝은 불씨 일부만 PointLight로 샘플링
  3. 주변에 작은 후광 스프라이트 추가
  4. 가능하면 bloom 후처리 적용
const emberLight = new THREE.PointLight(0xff6a22, 0.7, 1.8, 2.0)
emberLight.position.copy(ember.position)
scene.add(emberLight)

실제 PointLight는 매 프레임 전체를 갱신하지 말고, 밝기 상위 8~16개 정도만 선택하는 것이 안전합니다.

권장 렌더링 구조

EmberEmitter
 ├─ EmberPoints
 │   ├─ SoftParticle shader
 │   ├─ Additive blending
 │   └─ Size/Opacity/Flicker curves
 ├─ SmokePoints
 │   ├─ Noise density shader
 │   └─ Normal blending
 ├─ GlowSprites
 └─ Dynamic ember lights

추가로 모바일이나 저사양 환경에서는 다음 단계적 품질 설정을 권장합니다.

  • 고품질: 불씨 2,000개 + 연기 600개 + 동적 광원 16개
  • 중간 품질: 불씨 900개 + 연기 250개 + 동적 광원 6개
  • 저품질: 불씨 350개 + 연기 100개 + 동적 광원 0개

프로젝트 파일이나 사용 중인 렌더러(Three.js, Unity, Unreal 등)가 제공되면 해당 구조에 맞춘 실제 코드와 셰이더 파일로 구체화할 수 있습니다.

같은 분류의 프롬프트

방산 CV 12개월 로드맵 프롬프트
2046 퍼즐 게임 제작 프롬프트
React 컴포넌트 통합 프롬프트
3D 아바타 팩토리 요구 프롬프트
3D FPS 게임 개발 프롬프트