Link

νŒŒμ΄ν”„λΌμΈ λΉŒλ”λ₯Ό 생성할 λ•Œ, λΈ”λ Œλ”© λ‘œμ§μ€ μ™„μ „νžˆ μƒλž΅ν–ˆμ—ˆμŠ΅λ‹ˆλ‹€. λΈ”λ Œλ”©μ€ 투λͺ…ν•œ κ°μ²΄λ‚˜ λͺ‡λͺ‡ κ·Έλž˜ν”½ νš¨κ³Όμ— ν•„μˆ˜μ μœΌλ‘œ μ‚¬μš©λ˜κΈ° λ•Œλ¬Έμ— μ€‘μš”ν•œ κΈ°λŠ₯μž…λ‹ˆλ‹€. λ”°λΌμ„œ μ΄λ²ˆμ—λŠ” μ§€λ‚œ κΈ€μ—μ„œ λ Œλ”λ§ν•œ μ‚¬κ°ν˜•μ„ 투λͺ…ν•˜κ²Œ λ§Œλ“€κ² μŠ΅λ‹ˆλ‹€.

νŒŒμ΄ν”„λΌμΈ λΈ”λ Œλ”©

μ…°μ΄λ”μ—μ„œ λΈ”λ Œλ”©μ„ μ œμ–΄ν•  μˆ˜λŠ” μ—†μœΌλ©°, μ΄λŠ” νŒŒμ΄ν”„λΌμΈμ˜ μ†μ„±μž…λ‹ˆλ‹€. GPU ν•˜λ“œμ›¨μ–΄ μžμ²΄κ°€ λΈ”λ Œλ”© 연산을 μ²˜λ¦¬ν•˜λ©°, λ‹€μ–‘ν•œ μ˜΅μ…˜μ„ μ œκ³΅ν•©λ‹ˆλ‹€. PipelineBuilder에 2κ°€μ§€ μƒˆλ‘œμš΄ λΈ”λ Œλ”© λͺ¨λ“œλ₯Ό μΆ”κ°€ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€. ν•˜λ‚˜λŠ” λ‹¨μˆœνžˆ 색상을 λ”ν•˜λŠ” addtive blending, λ‹€λ₯Έ ν•˜λ‚˜λŠ” 색상과 μ•ŒνŒŒ 값을 μ„žλŠ” alpha blending μž…λ‹ˆλ‹€.

PipelineBuilder에 λ‹€μŒ 두 ν•¨μˆ˜λ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€.

void PipelineBuilder::enable_blending_additive()
{
    _colorBlendAttachment.colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT;
    _colorBlendAttachment.blendEnable = VK_TRUE;
    _colorBlendAttachment.srcColorBlendFactor = VK_BLEND_FACTOR_SRC_ALPHA;
    _colorBlendAttachment.dstColorBlendFactor = VK_BLEND_FACTOR_ONE;
    _colorBlendAttachment.colorBlendOp = VK_BLEND_OP_ADD;
    _colorBlendAttachment.srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE;
    _colorBlendAttachment.dstAlphaBlendFactor = VK_BLEND_FACTOR_ZERO;
    _colorBlendAttachment.alphaBlendOp = VK_BLEND_OP_ADD;
}

void PipelineBuilder::enable_blending_alphablend()
{
    _colorBlendAttachment.colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT;
    _colorBlendAttachment.blendEnable = VK_TRUE;
    _colorBlendAttachment.srcColorBlendFactor = VK_BLEND_FACTOR_SRC_ALPHA;
    _colorBlendAttachment.dstColorBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;
    _colorBlendAttachment.colorBlendOp = VK_BLEND_OP_ADD;
    _colorBlendAttachment.srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE;
    _colorBlendAttachment.dstAlphaBlendFactor = VK_BLEND_FACTOR_ZERO;
    _colorBlendAttachment.alphaBlendOp = VK_BLEND_OP_ADD;
}

Vulkanμ—μ„œ λΈ”λ Œλ”© μ˜΅μ…˜μ„ μ„€μ •ν•  λ•Œ 색상과 μ•ŒνŒŒκ°’μ— 각각에 λŒ€ν•΄ λΈ”λ Œλ”© 식을 μ§€μ •ν•΄μ£Όμ–΄μ•Ό ν•©λ‹ˆλ‹€. 색상과 μ•ŒνŒŒμ— λ§€κ°œλ³€μˆ˜λŠ” λ™μΌν•˜κ²Œ λ™μž‘ν•˜λ©°, λΈ”λ Œλ”© 식은 λ‹€μŒκ³Ό 같은 λ°©μ‹μœΌλ‘œ μž‘λ™ν•©λ‹ˆλ‹€.

outColor = srcColor * srcColorBlendFactor <op> dstColor * dstColorBlendFactor;

λΈ”λ Œλ”©μ—λŠ” μ—¬λŸ¬ μ—°μ‚°μžκ°€ μžˆμ§€λ§Œ, λŒ€λΆ€λΆ„μ€ κ°€μž₯ 기본적이고 μ•ˆμ •μ μœΌλ‘œ μž‘λ™ν•˜λŠ” VK_BLEND_OP_ADDλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. κ·Έ 외에도 λ‹€μ–‘ν•œ κ³ κΈ‰ μ—°μ‚°μžλ“€μ΄ μžˆμ§€λ§Œ, λŒ€λΆ€λΆ„ ν™•μž₯이 ν•„μš”ν•˜λ©° μ—¬κΈ°μ„œλŠ” 닀루지 μ•Šκ² μŠ΅λ‹ˆλ‹€. SourceλŠ” νŒŒμ΄ν”„λΌμΈμ—μ„œ ν˜„μž¬ μ²˜λ¦¬μ€‘μΈ 색상을 μ˜λ―Έν•˜κ³ , Destination은 μš°λ¦¬κ°€ λ Œλ”λ§ 쀑인 μ΄λ―Έμ§€μ˜ ν˜„μž¬ ν”½μ…€ κ°’μž…λ‹ˆλ‹€.

μœ„μ˜ 식을 λ°”νƒ•μœΌλ‘œ λ§μ…ˆ λΈ”λ Œλ”©μ΄ μ–΄λ–»κ²Œ μž‘λ™ν•˜λŠ”μ§€ μ„€λͺ…ν•˜κ² μŠ΅λ‹ˆλ‹€.

VK_BLEND_FACTOR_ONE은 blend factorλ₯Ό 1.0으둜 μ„€μ •ν•˜λ―€λ‘œ, κ³±μ…ˆ μ—°μ‚° 없이 κ·ΈλŒ€λ‘œ λ”ν•΄μ§€κ²Œ λ©λ‹ˆλ‹€. VK_BLEND_FACTOR_SRC_ALPHA은 반면 Source의 alpha 값을 κ³±ν•©λ‹ˆλ‹€. 이 경우 우리의 λΈ”λ Œλ”© 곡식은 λ‹€μŒκ³Ό 같은 ν˜•νƒœκ°€ λ©λ‹ˆλ‹€.

outColor = srcColor.rgb * srcColor.a + dstColor.rgb * 1.0

μ•ŒνŒŒ λΈ”λ Œλ”©μ„ μ‚¬μš©ν•  경우 λŒ€μ‹  λ‹€μŒκ³Ό 같은 λͺ¨μŠ΅μ΄ 될 κ²ƒμž…λ‹ˆλ‹€.

outColor = srcColor.rgb * srcColor.a + dstColor.rgb * (1.0 - srcColor.a)

본질적으둜 srcColor의 alpha값에 μ˜ν•΄ μ œμ–΄λ˜λŠ” 보간을 μˆ˜ν–‰ν•˜λŠ” μ…ˆμ΄λ©°, 이 alpha 값은 μ…°μ΄λ”μ—μ„œ μ „λ‹¬λ©λ‹ˆλ‹€.

이걸 μ‚¬μš©ν•΄ μ–΄λ–€ κ²°κ³Όκ°€ λ‚˜μ˜€λŠ”μ§€ 확인해 λ΄…μ‹œλ‹€. μ…°μ΄λ”μ—μ„œλŠ” μ•ŒνŒŒ 값을 λ”°λ‘œ μ„€μ •ν•˜μ§€ μ•Šμ•˜μœΌλ‹ˆ, addtiveλ₯Ό μ‚¬μš©ν•΄ λ΄…μ‹œλ‹€. init_mesh_pipeline()ν•¨μˆ˜μ—μ„œ λΈ”λ Œλ”© 섀정을 λ³€κ²½ν•΄ μ£Όμ„Έμš”.`

//pipelineBuilder.disable_blending();
pipelineBuilder.enable_blending_additive();

이제 μ›μˆ­μ΄ λ©”μ‹œκ°€ 반투λͺ…ν•΄μ§„ 것을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. λ‹€μ–‘ν•œ λΈ”λ Œλ”© λͺ¨λ“œλ₯Ό μ‹œλ„ν•΄λ³΄λ©΄μ„œ 각각이 μ–΄λ–€ 효과λ₯Ό μ£ΌλŠ”μ§€ 확인해 λ³΄μ„Έμš”.

4μž₯으둜 λ„˜μ–΄κ°€κΈ° 전에 μ°½ 크기 μ‘°μ • κΈ°λŠ₯을 κ΅¬ν˜„ν•΄λ΄…μ‹œλ‹€.

Next: Window Resizing