--- category: Unified tags: [auto-consolidated, technical-documentation] title: [[Fragment Shading|Fragment Shading]] last_updated: 2026-05-02 --- # [[Fragment Shading|Fragment Shading]] ## πŸ“Œ Brief Summary > ν”„λž˜κ·Έλ¨ΌνŠΈ 셰이딩(Fragment Shading)은 λ Œλ”λ§ νŒŒμ΄ν”„λΌμΈ ν›„λ°˜λΆ€μ—μ„œ ν”½μ…€ λ‹¨μœ„μ˜ λ Œλ”λ§ 계산(퍼 ν”½μ…€ μ‘°λͺ… μ—°μ‚° λ“±)을 μˆ˜ν–‰ν•˜μ—¬ μ΅œμ’… 색상 값을 κ²°μ •ν•˜λŠ” ν”„λ‘œμ„ΈμŠ€μ΄λ‹€ [1, 2]. λ‹€μˆ˜μ˜ ν…μŠ€μ²˜ λ£©μ—…μ΄λ‚˜ λ³΅μž‘ν•œ 연산이 포함될 경우 ν•„ 레이트([[Fill Rate|Fill Rate]])λ₯Ό 크게 μ €ν•˜μ‹œν‚¬ 수 있으며 [2], 동일 픽셀에 μ—¬λŸ¬ 번 λ Œλ”λ§ 연산이 μ€‘μ²©λ˜λŠ” μ˜€λ²„λ“œλ‘œμš°([[Overdraw|Overdraw]]) ν˜„μƒμ΄ λ°œμƒν•  경우 GPU μ„±λŠ₯ 병λͺ©μ˜ μ£Όμš” 원인이 λ˜κΈ°λ„ ν•œλ‹€ [3]. --- > ν”„λž˜κ·Έλ¨ΌνŠΈ 셰이딩(Fragment Shading)은 κ·Έλž˜ν”½ λ Œλ”λ§ νŒŒμ΄ν”„λΌμΈμ˜ ν›„λ°˜λΆ€ λ‹¨κ³„λ‘œ, μ΅œμ’… 색상 값을 κ²°μ •ν•˜κΈ° μœ„ν•΄ ν”½μ…€ λ‹¨μœ„μ˜ 연산을 μ‹€ν–‰ν•˜λŠ” 과정이닀 [1, 2]. 주둜 ν…μŠ€μ²˜ 데이터 μƒ˜ν”Œλ§, ν”½μ…€ λ‹¨μœ„ μ‘°λͺ…(per-pixel lighting), μ•ŒνŒŒ(투λͺ…도) 값을 κ³„μ‚°ν•˜μ—¬ ν‘œλ©΄μ˜ λ””ν…ŒμΌμ„ κ΅¬ν˜„ν•˜λŠ” 역할을 μˆ˜ν–‰ν•œλ‹€ [1, 3, 4]. 화면에 λ³΄μ΄λŠ” 픽셀에 λŒ€ν•΄ 계산을 μˆ˜ν–‰ν•˜λ―€λ‘œ, 픽셀이 μ€‘μ²©λ˜μ–΄ μ—¬λŸ¬ 번 λ Œλ”λ§λ˜λŠ” μ˜€λ²„λ“œλ‘œμš°([[Overdraw|Overdraw]])κ°€ λ°œμƒν•˜κ±°λ‚˜ λ³΅μž‘ν•œ 셰이더λ₯Ό μ‚¬μš©ν•  경우 GPU μ„±λŠ₯ μ €ν•˜ 및 ν”„λ ˆμž„ μ§€μ—°μ˜ μ£Όμš” 원인이 λœλ‹€ [1, 2]. ## πŸ“– Core Content - **ν”½μ…€ λ‹¨μœ„ μ—°μ‚°μ˜ μˆ˜ν–‰:** ν”„λž˜κ·Έλ¨ΌνŠΈ μ…°μ΄λ”λŠ” ν”½μ…€μ˜ μ΅œμ’… 색상 값을 κ²°μ •ν•˜λŠ” ν”½μ…€ λ‹¨μœ„μ˜ 계산을 μ „λ‹΄ν•œλ‹€ [2]. λ²„ν…μŠ€ 셰이더([[Vertex Shader|Vertex Shader]])와 ν”„λž˜κ·Έλ¨ΌνŠΈ 셰이더 μ‚¬μ΄μ—μ„œλŠ” varying λ³€μˆ˜λ₯Ό 톡해 데이터가 μ „λ‹¬λ˜λ©° [4], κ΅¬μ›Œμ§„ λ…Έλ©€ λ§΅(baked normal maps) 등을 ν™œμš©ν•΄ λ³΅μž‘ν•œ ν‘œλ©΄ λ””ν…ŒμΌμ„ ν”½μ…€ 셰이딩(pixel shading) λ°©μ‹μœΌλ‘œ λ Œλ”λ§ν•œλ‹€ [1]. - **셰이더 λ³΅μž‘λ„μ™€ ν•„ 레이트(Fill Rate):** ν”„λž˜κ·Έλ¨ΌνŠΈ 셰이더 λ‚΄μ—μ„œ μ—¬λŸ¬ ν…μŠ€μ²˜λ₯Ό μ‘°νšŒν•˜κ±°λ‚˜, μˆ˜ν•™μ  μ—°μ‚° 및 쑰건 논리가 λ³΅μž‘ν•΄μ§ˆ 경우 쀑간 μ‚¬μ–‘μ˜ GPUμ—μ„œλŠ” ν•„ λ ˆμ΄νŠΈκ°€ 50-70%κ°€λŸ‰ κ°μ†Œν•  수 μžˆλ‹€ [2]. 특히 PBR(물리 기반 λ Œλ”λ§) ν™˜κ²½μ—μ„œλŠ” 각 ν”½μ…€λ§ˆλ‹€ λ‹€μˆ˜μ˜ ν…μŠ€μ²˜ μƒ˜ν”Œλ§(μ•Œλ² λ„, λ…Έλ©€, λ©”νƒˆλ¦­, λŸ¬ν”„λ‹ˆμŠ€ λ“±) 및 ν™˜κ²½ λ°˜μ‚¬ 연산을 μ²˜λ¦¬ν•΄μ•Ό ν•˜λ―€λ‘œ ν”„λž˜κ·Έλ¨ΌνŠΈ 처리 μ‹œκ°„μ΄ κΈ‰μ¦ν•˜κ²Œ λœλ‹€ [2]. - **μ˜€λ²„λ“œλ‘œμš°(Overdraw)의 영ν–₯:** ν”„λž˜κ·Έλ¨ΌνŠΈ 셰이딩 λ‹¨κ³„μ—μ„œ λ‚˜νƒ€λ‚˜λŠ” μ˜€λ²„λ“œλ‘œμš°λŠ” 투λͺ…ν•œ κΈ°ν•˜ν•™μ  ꡬ쑰가 κ²ΉμΉ˜κ±°λ‚˜ 깊이 μ •λ ¬(Depth [[Sorting|Sorting]])이 νš¨μœ¨μ μ΄μ§€ μ•Šμ•„ λ™μΌν•œ ν”½μ…€ μœ„μΉ˜μ— λ Œλ”λ§ μ“°κΈ° μž‘μ—…μ΄ μ—¬λŸ¬ 번 μ€‘μ²©λ˜λŠ” ν˜„μƒμ΄λ‹€ [3, 5]. μ΄λŠ” 화면에 보이지 μ•ŠλŠ” ν”½μ…€μ˜ μ—°μ‚°μ—κΉŒμ§€ GPU μžμ›μ„ λ‚­λΉ„ν•˜κ²Œ λ§Œλ“ λ‹€ [5]. - **μ •λ ¬ λΆ€μž¬μ™€ ν”„λž˜κ·Έλ¨ΌνŠΈ λ°”μš΄λ“œ([[Fragment-bound|Fragment-bound]]) ν˜„μƒ:** 뢈투λͺ… 객체λ₯Ό λ Œλ”λ§ν•  λ•Œ 객체λ₯Ό 'μ•žμ—μ„œ λ’€λ‘œ(Front-to-Back)' μ •λ ¬ν•˜λ©΄ κ°€λ €μ§„ ν”½μ…€ 연산을 일찍 μ’…λ£Œν•˜λŠ” Early-Z μ΅œμ ν™”λ₯Ό 톡해 μ„±λŠ₯을 확보할 수 μžˆλ‹€ [3]. ν•˜μ§€λ§Œ [[InstancedMesh|InstancedMesh]]처럼 μΈμŠ€ν„΄μŠ€λ“€μ΄ μ •λ ¬λ˜μ§€ μ•Šμ€ μƒνƒœλ‘œ λ Œλ”λ§λ˜λŠ” 경우 이 μ΅œμ ν™”κ°€ λΆˆκ°€λŠ₯ν•΄ λ§‰λŒ€ν•œ μ˜€λ²„λ“œλ‘œμš° λΉ„μš©μ„ λ°œμƒμ‹œν‚€λ©°, 결과적으둜 전체 씬(Scene)의 λ Œλ”λ§μ΄ ν”„λž˜κ·Έλ¨ΌνŠΈ μ—°μ‚°μ˜ ν•œκ³„μ— λΆ€λ”ͺνžˆλŠ” ν”„λž˜κ·Έλ¨ΌνŠΈ λ°”μš΄λ“œ μƒνƒœμ— 빠질 수 μžˆλ‹€ [3, 6]. --- - **μ—­ν•  및 데이터 처리:** ν”„λž˜κ·Έλ¨ΌνŠΈ μ…°μ΄λ”λŠ” 정점 셰이더([[Vertex Shader|Vertex Shader]])λ‘œλΆ€ν„° Varying λ³€μˆ˜λ₯Ό 톡해 데이터λ₯Ό 전달받아 ν”½μ…€ λ‹¨μœ„λ‘œ μ²˜λ¦¬ν•œλ‹€ [5]. 이 μ…°μ΄λ”λŠ” ν”½μ…€ 셰이딩이라 λΆˆλ¦¬λŠ” μ‘°λͺ… 계산, λ…Έλ©€ 맡을 ν™œμš©ν•œ λ―Έμ„Έν•œ ν‘œλ©΄ λ””ν…ŒμΌ λͺ¨μ‚¬, 그리고 ν…μŠ€μ²˜μ— λ”°λ₯Έ μ•ŒνŒŒ(Alpha) κ°’ μ—°μ‚° 등을 λ‹΄λ‹Ήν•œλ‹€ [3, 4]. 이 밖에도 폰트 벑터 데이터λ₯Ό λ°”νƒ•μœΌλ‘œ ν”„λž˜κ·Έλ¨ΌνŠΈ 셰이더 λ‚΄μ—μ„œ 직접 ν…μŠ€νŠΈλ₯Ό μž¬λ Œλ”λ§ν•˜λŠ” 기법도 μ‘΄μž¬ν•œλ‹€ [6, 7]. - **μ„±λŠ₯ 병λͺ©κ³Ό μ˜€λ²„λ“œλ‘œμš°(Overdraw):** μ—¬λŸ¬ 개의 ν…μŠ€μ²˜ μƒ˜ν”Œλ§κ³Ό λ³΅μž‘ν•œ μˆ˜ν•™μ  μ—°μ‚° 및 쑰건문이 ν¬ν•¨λœ PBR(Physically Based Rendering) 재질 같은 λ³΅μž‘ν•œ μ…°μ΄λ”λŠ” 쀑간 사양 GPU의 ν•„ 레이트([[Fill Rate|Fill Rate]])λ₯Ό 50~70%κΉŒμ§€ κ°μ†Œμ‹œν‚¬ 수 μžˆλ‹€ [1]. 특히 λ™μΌν•œ ν”½μ…€ μœ„μΉ˜μ— μ—¬λŸ¬ 번 μ“°κΈ° μž‘μ—…μ΄ μ€‘μ²©λ˜λŠ” μ˜€λ²„λ“œλ‘œμš°(Overdraw) ν˜„μƒμ΄ λ°œμƒν•˜λ©΄ 씬(Scene) 전체가 'ν”„λž˜κ·Έλ¨ΌνŠΈ λ°”μš΄λ“œ([[Fragment-bound|Fragment-bound]])' μƒνƒœμ— λΉ μ Έ μ‹¬κ°ν•œ ν”„λ ˆμž„ 처리 지연이 λ°œμƒν•œλ‹€ [2]. - **ν”„λž˜κ·Έλ¨ΌνŠΈ 셰이더 μ΅œμ ν™” 기법:** - **거리 기반 및 κ°€μ‹œμ„± μ΅œμ ν™”:** 동적 LOD(Level of Detail) μ „ν™˜μ„ ν™œμš©ν•˜λ©΄ ν”½μ…€ 레벨의 GPU ν”„λž˜κ·Έλ¨ΌνŠΈ 처리 연산을 60~75%κ°€λŸ‰ 쀄일 수 μžˆλ‹€ [8]. λ˜ν•œ 뎁슀 ν”„λ¦¬νŒ¨μŠ€([[Depth Pre-Pass|Depth Pre-Pass]])λ₯Ό κ΅¬ν˜„ν•˜λ©΄ GPUκ°€ κ°’λΉ„μ‹Ό 메인 셰이더 연산에 μ§„μž…ν•˜κΈ° 전에 κ°€λ €μ§„ ν”„λž˜κ·Έλ¨ΌνŠΈλ₯Ό 미리 폐기(Discard)ν•˜μ—¬ ν”„λž˜κ·Έλ¨ΌνŠΈ μ…°μ΄λ”μ˜ λΆ€ν•˜λ₯Ό μ΅œλŒ€ 30%κΉŒμ§€ κ°μ†Œμ‹œν‚¨λ‹€ [9]. - **재질(Material) λͺ¨λΈ λ‹¨μˆœν™”:** μ—°μ‚°λŸ‰μ΄ λ§Žμ€ `MeshStandardMaterial`은 ν”„λž˜κ·Έλ¨ΌνŠΈ ν”„λ‘œμ„Έμ„œλ₯Ό 포화 μƒνƒœλ‘œ λ§Œλ“€ 수 μžˆμœΌλ―€λ‘œ, ν•˜λ“œμ›¨μ–΄ μ„±λŠ₯이 μ œν•œμ μΈ ν™˜κ²½μ—μ„œλŠ” 픽셀별 μŠ€νŽ™ν˜λŸ¬ ν•˜μ΄λΌμ΄νŠΈλ§Œ μ œκ³΅ν•˜λŠ” `MeshPhongMaterial`μ΄λ‚˜ μ‘°λͺ… 연산을 λ°°μ œν•œ ν”Œλž« 셰이딩(Flat Shaded) μ»€μŠ€ν…€ 셰이더λ₯Ό μ‚¬μš©ν•˜μ—¬ ν”„λž˜κ·Έλ¨ΌνŠΈ μ—°μ‚° λΉ„μš©μ„ μ΅œμ†Œν™”ν•΄μ•Ό ν•œλ‹€ [10, 11]. - **절차적 λ Œλ”λ§(Procedural Rendering):** μ—£μ§€(Edge)λ‚˜ μ™€μ΄μ–΄ν”„λ ˆμž„μ„ 그릴 λ•Œ λ³„λ„μ˜ κΈ°ν•˜ν•™μ  λ„ν˜•μ„ μΆ”κ°€λ‘œ 그리지 μ•Šκ³ , λ¬΄κ²Œμ€‘μ‹¬ μ’Œν‘œκ³„(Barycentric Coordinate)λ₯Ό μ΄μš©ν•΄ ν”„λž˜κ·Έλ¨ΌνŠΈ 셰이더 λ‚΄μ—μ„œ 절차적으둜 μ—£μ§€κΉŒμ§€μ˜ 거리λ₯Ό κ³„μ‚°ν•˜μ—¬ λ Œλ”λ§ν•˜λŠ” 것이 훨씬 νš¨μœ¨μ μ΄λ‹€ [12]. ## βš–οΈ Trade-offs & Caveats - **κ³Όκ±° λ°μ΄ν„°μ™€μ˜ 좩돌:** μžλ™ν™” 엔진에 μ˜ν•΄ λ§€ν•‘λœ μ§€μ‹μœΌλ‘œ, μΆ”ν›„ μ •λ°€ 검증 ν•„μš”. - **μ •μ±… λ³€ν™”:** Graphics & Performance λΆ„μ•Όμ˜ μžλ™ μžμ‚°ν™” μˆ˜ν–‰. --- - **κ³Όκ±° λ°μ΄ν„°μ™€μ˜ 좩돌:** μžλ™ν™” 엔진에 μ˜ν•΄ λ§€ν•‘λœ μ§€μ‹μœΌλ‘œ, μΆ”ν›„ μ •λ°€ 검증 ν•„μš”. - **μ •μ±… λ³€ν™”:** Graphics & Performance λΆ„μ•Όμ˜ μžλ™ μžμ‚°ν™” μˆ˜ν–‰. ## πŸ”— Knowledge Connections - **Related Topics:** [[Overdraw|Overdraw]], Vertex Shader, Fill Rate, [[PBR|PBR]] - **Projects/Contexts:** Three.js [[WebGL|WebGL]] Rendering Optimization, InstancedMesh Performance [[Bottlenecks|Bottlenecks]] - **Contradictions/Notes:** μ†ŒμŠ€μ— κ΄€λ ¨ 정보가 λΆ€μ‘±ν•©λ‹ˆλ‹€. --- *Last updated: 2026-04-19* --- --- - **Related Topics:** [[Overdraw|Overdraw]], Vertex Shader, [[Level of Detail (LOD)|Level of Detail (LOD]], Physically Based Rendering (PBR) - **Projects/Contexts:** Three.js, [[WebGL|WebGL]] - **Contradictions/Notes:** μ‹œκ°μ μΈ ν˜„μ‹€κ°μ„ μ œκ³΅ν•˜λŠ” PBR λͺ¨λΈμ˜ μž¬μ§ˆμ€ 사싀적인 λΉ› λ°˜μ‚¬λ₯Ό κ΅¬ν˜„ν•˜μ§€λ§Œ ν”„λž˜κ·Έλ¨ΌνŠΈ μ…°μ΄λ”μ—μ„œ μˆ˜λ§Žμ€ μ—°μ‚°κ³Ό ν…μŠ€μ²˜ μƒ˜ν”Œλ§μ„ μš”κ΅¬ν•œλ‹€. λ”°λΌμ„œ λ‚΄μž₯ GPU(iGPU)와 같은 저사양 ν•˜λ“œμ›¨μ–΄ ν™˜κ²½μ—μ„œλŠ” μ„±λŠ₯을 크게 μ €ν•˜μ‹œν‚€λ©°, 였히렀 μ—°μ‚°λŸ‰μ΄ 적은 Phong λͺ¨λΈμ΄λ‚˜ ν”Œλž« 셰이딩 μž¬μ§ˆμ„ μ‚¬μš©ν•˜λŠ” 것이 높은 ν”„λ ˆμž„ 레이트 μœ μ§€λ₯Ό μœ„ν•΄ ν•„μˆ˜μ μ΄λΌκ³  μ†ŒμŠ€λŠ” μ„€λͺ…ν•œλ‹€ [1, 10, 11]. --- *Last updated: 2026-04-19* ---