+ Covers every effect with shader-level detail.
- Overlong, with a few overstated performance claims.
a Technical Artist specializing in atmospheric 3D effects such as volumetric fog, falling embers, and localized weather systems.
| Category | Development › Coding |
|---|---|
| Tags | DraftingAnalyzingDeveloperCode |
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.
This technical art prompt creates an Embers and Ash effect for an atmospheric 3D landing page. It includes size and opacity over lifetime, wind sway, and a secondary smoke layer.
Gemini is the most complete but verbose. ChatGPT is concise and practical but mishandles depth, while [C] is absent.
+ Covers every effect with shader-level detail.
- Overlong, with a few overstated performance claims.
+ Clear parameters and practical quality tiers.
- Its soft fade incorrectly subtracts nonlinear depths.
| Criterion | ChatGPT | Gemini | Leader |
|---|---|---|---|
| Instruction following | 8 | 9 | Gemini +13% |
| Accuracy | 6 | 8 | Gemini +33% |
| Specificity | 8 | 10 | Gemini +25% |
| Structure | 9 | 8 | ChatGPT +13% |
| Right length | 9 | 6 | ChatGPT +50% |
Scored 1–10 by gpt-5.6-sol with model names hidden (2026-09-25). This is an AI review, not a measurement.
We gave three models the same input and copied their answers unedited. Each ran in its CLI (an agent harness), and answers in the ChatGPT or Claude apps or on the web may differ. Outputs are in Korean.
현재 워크스페이스는 읽기 전용이며 프로젝트 파일을 확인하거나 수정할 수 없어, 아래와 같이 구현 설계를 제안합니다.
각 파티클에 다음 속성을 부여합니다.
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.40.15 ~ 0.51.5 ~ 4.5초0.015 ~ 0.06#ffb347, #ff6a2a, #ffd27a입자 크기는 초기에 작게 시작하고, 중간에 커진 뒤 사라지도록 합니다.
float sizeCurve = smoothstep(0.0, 0.12, life01)
* (1.0 - smoothstep(0.72, 1.0, life01));
gl_PointSize = aSize * sizeCurve * uPixelRatio;
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;
이렇게 하면 생성 직후 갑자기 나타나지 않고, 마지막에는 자연스럽게 꺼집니다.
깊이 텍스처와 현재 파티클 깊이를 비교해 지오메트리 교차 부분을 부드럽게 페이드합니다.
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을 사용하는 편이 더 자연스럽습니다.
연기 입자는 별도의 낮은 밀도 레이어로 둡니다.
0.3 ~ 1.20.025 ~ 0.124 ~ 10초NormalBlendingfloat 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을 사용하지 않는 것이 좋습니다. 그렇지 않으면 어두운 판타지 분위기보다 밝은 안개처럼 보일 수 있습니다.
각 불씨를 실제 광원으로 만들면 광원 수가 많아져 성능 문제가 발생하므로, 두 레이어를 조합합니다.
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
추가로 모바일이나 저사양 환경에서는 다음 단계적 품질 설정을 권장합니다.
프로젝트 파일이나 사용 중인 렌더러(Three.js, Unity, Unreal 등)가 제공되면 해당 구조에 맞춘 실제 코드와 셰이더 파일로 구체화할 수 있습니다.
| 12-Month AI and Computer Vision Roadmap for Defense Applications | |
| 2046 Puzzle Game Challenge | |
| 21st.dev component prompt | |
| 3D FACTORY | |
| 3D FPS Game |