Link

μ§€κΈˆκΉŒμ§€λŠ” λ Œλ”λ§ 루프λ₯Ό κ΅¬μ„±ν•˜κ³  μ»΄ν“¨νŠΈ 셰이더λ₯Ό μ‚¬μš©ν•΄ 이미지λ₯Ό 그릴 수 μžˆλŠ” 방법을 λ§ˆλ ¨ν–ˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ 아직은 μ‹€μ œ λ„ν˜•(geometry)을 κ·Έλ¦¬μ§€λŠ” λͺ»ν•©λ‹ˆλ‹€. λ„ν˜•μ„ λ Œλ”λ§ν•˜λ €λ©΄ GPU λ‚΄λΆ€μ˜ 특수 ν•˜λ“œμ›¨μ–΄λ₯Ό ν™œμš©ν•΄ λ Œλ”λ§μ„ μˆ˜ν–‰ν•˜κΈ° μœ„ν•œ λ‹€μ–‘ν•œ 섀정을 λ‹΄κ³  μžˆλŠ” κ·Έλž˜ν”½μŠ€ νŒŒμ΄ν”„λΌμΈμ„ μ„€μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€. μ΄λŸ¬ν•œ μž‘μ—…μ„ μ œλŒ€λ‘œ μˆ˜ν–‰ν•˜λ €λ©΄, μ–΄λ–»κ²Œ Vulkan λ Œλ”λ§ νŒŒμ΄ν”„λΌμΈμ΄ μž‘λ™ν•˜λŠ”μ§€ 이해해야 ν•©λ‹ˆλ‹€.

λ Œλ”λ§ νŒŒμ΄ν”„λΌμΈ

GPUλŠ” λ„ν˜•μ„ 그릴 λ•Œ μ‚¬μš©λ˜λŠ” λ‹€μ–‘ν•œ κΈ°λŠ₯을 κ°–κ³  μžˆμŠ΅λ‹ˆλ‹€. GPUλŠ” λ²”μš© μ»΄ν“¨νŒ… μœ λ‹›κ³Ό λ³„κ°œλ‘œ λ Œλ”λ§μ„ μœ„ν•œ μ „μš© ν•˜λ“œμ›¨μ–΄κ°€ λ³„λ„λ‘œ μ‘΄μž¬ν•©λ‹ˆλ‹€. 이 μ „μš© ν•˜λ“œμ›¨μ–΄λ“€μ€ μ‚Όκ°ν˜• ν˜Ήμ€ λ‹€λ₯Έ ν”„λ¦¬λ―Έν‹°λΈŒλ₯Ό λΉ λ₯΄κ³  효율적으둜 그릴 수 있게 ν•΄μ€λ‹ˆλ‹€.

GPUλ₯Ό ν•˜λ‚˜μ˜ μ–΄μ…ˆλΈ”λ¦¬ 라인이라고 생각해도 μ’‹μŠ΅λ‹ˆλ‹€. 각 λ‹¨κ³„μ—μ„œ μ„œλ‘œ λ‹€λ₯Έ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” μ—¬λŸ¬ κ΅¬μ„±μš”μ†Œκ°€ 있으며, μ΅œμ’… 결과물은 이미지에 λ Œλ”λ§λœ ν”½μ…€μž…λ‹ˆλ‹€. 이 β€œμ–΄μ…ˆλΈ”λ¦¬ 라인”을 κ·Έλž˜ν”½μŠ€ νŒŒμ΄ν”„λΌμΈμ΄λΌ λΆ€λ¦…λ‹ˆλ‹€.

κ·Έλž˜ν”½μŠ€ νŒŒμ΄ν”„λΌμΈμ—μ„œλŠ” 데이터와 ν”„λ‘œκ·Έλž¨μ΄ μž…λ ₯λ˜μ–΄ 픽셀이 좜λ ₯λ©λ‹ˆλ‹€. κ·Έλž˜ν”½μŠ€ ν”„λ‘œκ·Έλž˜λ¨Έμ˜ 일은 이λ₯Ό μš”κ΅¬μ‚¬ν•­μ— 맞게 적절히 κ΅¬μ„±ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

전체 Vulkan κ·Έλž˜ν”½μŠ€ νŒŒμ΄ν”„λΌμΈμ€ 맀우 λ³΅μž‘ν•˜λ―€λ‘œ, μš°μ„  λ‹¨μˆœν•œ 버전을 μ‚΄νŽ΄λ³Ό κ²ƒμž…λ‹ˆλ‹€. λ Œλ”λ§μ— μ‚¬μš©ν•  νŒŒμ΄ν”„λΌμΈμ„ ꡬ성해 λ‚˜κ°€λ©΄μ„œ 각 단계에 μ„ΈλΆ€ λ‚΄μš©λ„ ν•¨κ»˜ 닀뀄볼 κ²ƒμž…λ‹ˆλ‹€.

κ·Έλž˜ν”½μŠ€ νŒŒμ΄ν”„λΌμΈμ€ 데이터 μž…λ ₯ β†’ 정점 셰이더 β†’ λž˜μŠ€ν„°ν™” β†’ ν”„λž˜κ·Έλ¨ΌνŠΈ 셰이더 β†’ λ Œλ”λ§ 좜λ ₯ 순으둜 μ΄λ€„μ§‘λ‹ˆλ‹€.

두 셰이더 λ‹¨κ³„μ—μ„œλŠ” μš°λ¦¬κ°€ μ›ν•˜λŠ” μž‘μ—…μ„ μˆ˜ν–‰ν•˜λ„λ‘ μž‘μ„±λœ ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰λ©λ‹ˆλ‹€. 반면 λž˜μŠ€ν„°ν™”μ™€ λ Œλ”λ§ 좜λ ₯ λ‹¨κ³„λŠ” κ³ μ •λœ κΈ°λŠ₯을 μˆ˜ν–‰ν•˜λ©°, 이듀에 λŒ€ν•΄μ„œλŠ” λ§€κ°œλ³€μˆ˜λ‚˜ μ„€μ •λ§Œ μ‘°μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μš°μ„  데이터λ₯Ό μ€€λΉ„ν•΄μ•Ό ν•©λ‹ˆλ‹€ 이 λ°μ΄ν„°λŠ” ν…μŠ€μ³, 3D λͺ¨λΈ, λ¨Έν…Œλ¦¬μ–Ό λ“± μš°λ¦¬κ°€ μ›ν•˜λŠ” μ–΄λ–€ 것이든 될 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ λ°μ΄ν„°λŠ” νŒŒμ΄ν”„λΌμΈμ˜ 각 단계λ₯Ό 거치며 λ³€ν™˜λ˜μ–΄ κ²°κ΅­ 화면에 ν”½μ…€λ‘œ λ‚˜νƒ€λ‚˜κ²Œ λ©λ‹ˆλ‹€.

정점 μ…°μ΄λ”λŠ” λͺ¨λ“  μ •μ λ§ˆλ‹€ ν•œ λ²ˆμ”© μ‹€ν–‰λ˜λ©°, μ •μ μ˜ μœ„μΉ˜μ™€ κ·Έ μ™Έ 속성듀을 GPUκ°€ 이해할 수 μžˆλŠ” ν˜•νƒœλ‘œ λ³€ν™˜ν•΄ λž˜μŠ€ν„°ν™” 단계에 μ „λ‹¬ν•˜λŠ” 역할을 ν•©λ‹ˆλ‹€.

λž˜μŠ€ν„°ν™” λ‹¨κ³„λŠ” 정점 μ…°μ΄λ”μ—μ„œ μƒμ„±λœ 정점듀을 받아와 μ‚Όκ°ν˜•μ΄ ν™”λ©΄μ—μ„œ μ°¨μ§€ν•˜λŠ” 픽셀을 κ³„μ‚°ν•©λ‹ˆλ‹€. μ΄λ ‡κ²Œ κ³„μ‚°λœ 픽셀듀은 ν”„λž˜κ·Έλ¨ΌνŠΈ μ…°μ΄λ”λ‘œ μ „λ‹¬λ©λ‹ˆλ‹€. 이 과정은 κ·Έλž˜ν”½μŠ€ νŒŒμ΄ν”„λΌμΈμ„ ꡬ성할 λ•Œ λ‹€μ–‘ν•œ 섀정이 ν•„μš”ν•œ λΆ€λΆ„μž…λ‹ˆλ‹€.

ν”„λž˜κ·Έλ¨ΌνŠΈ μ…°μ΄λ”λŠ” μ΄λŸ¬ν•œ 픽셀듀을 μ‹€μ œ 색상 ν”½μ…€λ‘œ 좜λ ₯ν•˜λ©°, λž˜μŠ€ν„°ν™” κ³Όμ •μœΌλ‘œλΆ€ν„° 받은 ν”½μ…€λ§ˆλ‹€ ν•œ λ²ˆμ”© μ‹€ν–‰λ©λ‹ˆλ‹€.

λ Œλ”λ§ 좜λ ₯ λ‹¨κ³„μ—μ„œλŠ” μ΅œμ’… 색상 픽셀을 좜λ ₯ ν”„λ ˆμž„ 버퍼에 κΈ°λ‘ν•©λ‹ˆλ‹€. 이 λ‹¨κ³„μ—λŠ” κ³ μ • κΈ°λŠ₯ ν•˜λ“œμ›¨μ–΄ 섀정듀이 ν¬ν•¨λ˜μ–΄ 있으며, λΈ”λ Œλ”©μ΄λ‚˜ 깊이 ν…ŒμŠ€νŠΈμ™€ 같은 μž‘μ—…μ΄ μˆ˜ν–‰λ©λ‹ˆλ‹€.

λ‹€μŒ κΈ€μ—μ„œλŠ” μ§€κΈˆκΉŒμ§€ μ„€λͺ…ν•œ λ‚΄μš©μ„ λ°”νƒ•μœΌλ‘œ μ‹€μ œλ‘œ μ‚Όκ°ν˜•μ„ κ·Έλ €λ³΄κ² μŠ΅λ‹ˆλ‹€.

Next: Setting up render pipeline