Troika: ν…μŠ€νŠΈ 앀티앨리어싱 κ°œμ„ μ„ μœ„ν•œ λΉ λ₯Έ 아이디어

에 λ§Œλ“  2021λ…„ 06μ›” 17일  Β·  7μ½”λ©˜νŠΈ  Β·  좜처: protectwise/troika

μ €λŠ” 이전 버전을 μ‚¬μš©ν•˜κ³  있기 λ•Œλ¬Έμ— μ΅œκ·Όμ— 앀티앨리어싱 μ½”λ“œλ₯Ό μ—…λ°μ΄νŠΈν–ˆλŠ”μ§€ ν™•μ‹€ν•˜μ§€ μ•Šμ§€λ§Œ μ…°μ΄λ”λ‘œ κ·Έλ¦° μ›μ˜ 앀티앨리어싱을 μˆ˜ν–‰ν•˜λŠ” 쒋은 방법을 찾은 ν›„ ν…μŠ€νŠΈμ—λ„ μ‹œλ„ν•΄ 보고 μ‹Άμ—ˆμŠ΅λ‹ˆλ‹€. , ν…μŠ€νŠΈκ°€ SDF 기반이고 μ›μ˜ 앀티앨리어싱도 거리 기반이기 λ•Œλ¬Έμž…λ‹ˆλ‹€.

λ‚΄ ν˜„μž¬ λ²„μ „μ˜ Troikaμ—μ„œλŠ” aa 거리에 λŒ€ν•΄ return length(fwidth(vTroikaGlyphUV * vTroikaGlyphDimensions)) * 0.5; λ₯Ό μˆ˜ν–‰ν•©λ‹ˆλ‹€. 이것은 λΉ„μŠ€λ“¬νžˆ λ³Ό λ•Œ κ°€μž₯ μ™Όμͺ½κ³Ό κ°€μž₯ 였λ₯Έμͺ½ κ°€μž₯μžλ¦¬κ°€ λ‹€μ†Œ λˆˆμ— λ„κ²Œ νλ €μ§€λŠ” μ•„ν‹°νŒ©νŠΈκ°€ μžˆμŠ΅λ‹ˆλ‹€.
image

슀칼라둜 λ³€κ²½ν–ˆμŠ΅λ‹ˆλ‹€. λ‚΄ μ„œν΄ μ½”λ“œμ™€ 같은 거리: return fwidth(distance) * 0.5; troikaGetFragDistValue μ—μ„œ μ „λ‹¬λœ 거리와 ν•¨κ»˜: float distance = troikaGetFragDistValue(); float aaDist = troikaGetAADist(distance);
μ΄λ ‡κ²Œν•˜λ©΄ νλ¦Ών•œ μ•„ν‹°νŒ©νŠΈκ°€ λ°œμƒν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
image

더 λΆ€λ“œλŸ¬μš΄ 앀티앨리어싱을 μœ„ν•΄ 0.5 μš”μ†Œλ₯Ό 늘릴 수 μžˆμŠ΅λ‹ˆλ‹€. 예: 0.8 :
image

μ €μ²˜λŸΌ 이 방법을 λͺ¨λ₯΄μ‹œλŠ” 뢄듀이 κ³„μ‹€κΉŒλ΄ κ³΅μœ ν•΄λ΄…λ‹ˆλ‹€. λ‚΄ "κ΅¬ν˜„"μ—λŠ” λͺ‡ 가지 μ΄μƒν•œ μ•„ν‹°νŒ©νŠΈκ°€ 있으며(μ•„λž˜ μ°Έμ‘°) μ•„λ§ˆλ„ 이것이 당신이 λ‹€λ₯Έ 방법을 μ„ νƒν•œ 이유일 κ²ƒμž…λ‹ˆλ‹€. λ˜ν•œ 셰이더 μ½”λ“œμ—μ„œ aaDist λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 방법을 μ •ν™•νžˆ μ•Œμ§€ λͺ»ν•˜λ―€λ‘œ 이λ₯Ό κ΅¬ν˜„ν•˜λŠ” 데 더 λŠ₯μˆ™ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ 이 λ³€κ²½μœΌλ‘œ 인해 λ³€κ²½ν•˜κ±°λ‚˜ μ œκ±°ν•΄μ•Ό ν•˜λŠ” 일뢀 μ½”λ“œκ°€ μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€. 이 μ½”λ“œλŠ” "κ΅¬ν˜„"을 λ”μš± ν–₯μƒμ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.

image

bgolus의 κ²Œμ‹œλ¬Όμ—μ„œ 이 방법을 μ°Ύμ•˜μŠ΅λ‹ˆλ‹€. https://forum.unity.com/threads/antialiasing-circle-shader.432119/ 더 λ§Žμ€ 정보가 μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŠ” λ˜ν•œ 더 높은 정밀도λ₯Ό μœ„ν•΄ fwidth(distance) length(vec2(dFdx(distance), dFdy(distance))) λ₯Ό ν•  수 μžˆλ‹€κ³  λ§ν–ˆμ§€λ§Œ 이것이 λ¬΄μ‹œν•  수 μžˆλŠ”μ§€ μ—¬λΆ€λŠ” ν™•μ‹€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λͺ¨λ“  7 λŒ“κΈ€

μ œμ•ˆ κ°μ‚¬ν•©λ‹ˆλ‹€! λ‚˜λŠ” λΉ„μŠ€λ“¬ν•œ κ°λ„μ—μ„œλ„ νλ¦Ών•œ κ°€μž₯자리λ₯Ό λ°œκ²¬ν•˜κ³  μ œκ±°ν•˜κ³  μ‹ΆκΈ° λ•Œλ¬Έμ— 이것을 ν™•μ‹€νžˆ 쑰사할 κ²ƒμž…λ‹ˆλ‹€.

이둠적으둜 distance 의 λ³€κ²½κ³Ό vTroikaGlyphUV * vTroikaGlyphDimensions 의 변경은 λ‘˜ λ‹€ κΈ€κΌ΄ 곡간 λ‹¨μœ„μ˜ 거리λ₯Ό λ‚˜νƒ€λ‚΄κΈ° λ•Œλ¬Έμ— 동일해야 ν•˜μ§€λ§Œ 거기에 μ•½κ°„μ˜ λ―Έλ¬˜ν•œ 차이가 μžˆμ–΄μ•Ό ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. κ°„κ³Όν–ˆλ‹€. 당신이 보여쀀 μ•„ν‹°νŒ©νŠΈλ₯Ό ν”Όν•  수 μžˆλ‹€λ©΄ 기꺼이 λ‹Ήμ‹ μ˜ λ³€κ²½ 사항을 ν†΅ν•©ν•˜κ² μŠ΅λ‹ˆλ‹€. :)

μ—„μ²­λ‚œ! 변경은 ν•œ μ€„λ§ŒνΌ κ°„λ‹¨ν•©λ‹ˆλ‹€(그리고 이λ₯Ό μˆ˜μš©ν•˜κΈ° μœ„ν•΄ ν•΄λ‹Ή 거리 인수λ₯Ό 전달). κ·Έλž˜λ„ μ›μ‹œ μ½”λ“œλ₯Ό μ›ν•˜μ‹œλ©΄ 내일 근무할 λ•Œ 보내 λ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€.

이둠적으둜 거리의 변화와 vTroikaGlyphUV * vTroikaGlyphDimensions의 λ³€ν™”λŠ” λͺ¨λ‘ κΈ€κΌ΄ 곡간 λ‹¨μœ„μ˜ 거리λ₯Ό λ‚˜νƒ€λ‚΄κΈ° λ•Œλ¬Έμ— 동일해야 ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

νŒŒμƒ μƒν’ˆμ΄ μ–΄λ–»κ²Œ 같은지 μ •ν™•νžˆ μ΄ν•΄ν•˜μ§€ λͺ»ν•©λ‹ˆλ‹€. distance λŠ” λ‚΄κ°€ μΆ”μΈ‘ν•˜λŠ” SDF κ±°λ¦¬μ΄μ§€λ§Œ λ‹€λ₯Έ ν•˜λ‚˜λŠ” μŠ€μΌ€μΌλœ uv μœ„μΉ˜μž…λ‹ˆλ‹€. λ‚˜λŠ” μ½”λ“œμ™€ 그것듀이 μ–΄λ–»κ²Œ λΉ„κ΅λ˜λŠ”μ§€ 보지 μ•Šμ•˜μ§€λ§Œ, νŒŒμƒ μƒν’ˆμ΄ 달라야 ν•˜λŠ” κ²ƒμ²˜λŸΌ λŠκ»΄μ§‘λ‹ˆλ‹€. λ‚΄κ°€ μ•„λŠ” ν•œ fwidth λŠ” 이웃 ν”„λž˜κ·Έλ¨ΌνŠΈμ—μ„œ λ™μΌν•œ νŠΉμ • μž…λ ₯ κ°’κ³Ό ν•¨κ»˜ 인수둜 μ „λ‹¬λœ νŠΉμ • μž…λ ₯ κ°’μ˜ 차이λ₯Ό μ·¨ν•©λ‹ˆλ‹€. μ΄λŠ” 이웃 ν”„λž˜κ·Έλ¨ΌνŠΈκ°€ λ™μ‹œμ— λ³‘λ ¬λ‘œ μ‹€ν–‰λ˜κΈ° λ•Œλ¬Έμ— κ°€λŠ₯ν•©λ‹ˆλ‹€. λ‚˜λŠ” 였늘 일찍 gl_FragColor.rgb = vec3(fwidth(gl_FragColor.x + gl_FragColor.g + gl_FragColor.b)); 둜 ν…ŒμŠ€νŠΈλ₯Ό μ‹€ν–‰ν•˜μ—¬ 에지 감지/μ†Œλ²¨ 필터와 같은 에지λ₯Ό λ Œλ”λ§ν•˜λŠ”μ§€ ν™•μΈν•˜κ³  κ·Έ 사싀을 쑰금 ν™•μΈν•˜λ €κ³  μ‹œλ„ν–ˆμœΌλ©° μ‹€μ œλ‘œ ν–ˆμŠ΅λ‹ˆλ‹€.

토둠에 κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€. 이 λ‚΄μš©μ΄ 가끔 제 머리λ₯Ό μ•„ν”„κ²Œ ν•©λ‹ˆλ‹€. ;)

λ‚΄κ°€ "λ™λ“±ν•˜λ‹€"κ³  λ§ν–ˆμ„ λ•Œ λ‚˜λŠ” λ‘˜ λ‹€ λ™μΌν•œ λ‹¨μœ„μ˜ 거리λ₯Ό λ‚˜νƒ€λ‚Έλ‹€λŠ” 것을 μ˜λ―Έν–ˆμ§€λ§Œ μ •ν™•νžˆ κ°™μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€.

λ°±μ—…, μ—¬κΈ°μ„œ μš°λ¦¬κ°€ μ›ν•˜λŠ” 것은 ν”„λž˜κ·Έλ¨ΌνŠΈ κ°„μ˜ _잠재적_ λ³€ν™”μœ¨μž…λ‹ˆλ‹€. κ·€ν•˜κ°€ μ œμ•ˆν•œ κ²ƒμ²˜λŸΌ distance λ³€μˆ˜μ˜ λ³€κ²½ 사항을 μ‚¬μš©ν•˜λ©΄ μ’…μ’… μ •ν™•ν•˜μ§€λ§Œ κ²½μš°μ— 따라 맀우 λΆ€μ •ν™•ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” ν•΄λ‹Ή 값이 μƒ˜ν”Œλ§λœ SDFκ°€ _non-uniform_이기 λ•Œλ¬Έμž…λ‹ˆλ‹€. 곑선을 그리며 글리프λ₯Ό κ°€λ‘œμ§ˆλŸ¬ λ³€κ²½ λ°©ν–₯을 μ „ν™˜ν•©λ‹ˆλ‹€. λ”°λΌμ„œ 인접 쑰각 κ°„μ˜ distance λ„ν•¨μˆ˜λŠ” 글리프 경둜 μ‚¬μ΄μ—μ„œ 거리 ν•„λ“œκ°€ μ¦κ°€μ—μ„œ κ°μ†Œλ‘œ μ „ν™˜λ˜λŠ” κ²½μš°μ™€ 같이 λ„ˆλ¬΄ μž‘κ±°λ‚˜ 0일 μˆ˜λ„ 있고, ν…μŠ€νŠΈκ°€ ν‘œμ‹œλ  λ•Œμ™€ 같이 λ„ˆλ¬΄ 클 수 μžˆμŠ΅λ‹ˆλ‹€. μž‘μ€ ν¬κΈ°μ—μ„œ 쑰각 κ²©μžλŠ” μ˜ˆμΈ‘ν•  수 μ—†λŠ” μœ„μΉ˜μ—μ„œ SDFλ₯Ό μ˜€λ²„λ ˆμ΄ν•©λ‹ˆλ‹€. λ‚˜λŠ” 그것이 λ‹Ήμ‹ μ΄λ³΄κ³ μžˆλŠ” 유물 쀑 적어도 일뢀λ₯Ό μ„€λͺ…ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

κ·Έλ ‡λ‹€λ©΄ distance λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  _잠재적_ λ³€ν™”μœ¨μ„ μ–΄λ–»κ²Œ κ²°μ •ν•  수 μžˆμŠ΅λ‹ˆκΉŒ? "μŠ€μΌ€μΌλœ uv μœ„μΉ˜"라고 λΆ€λ₯΄λŠ” 것은 본질적으둜 distance 와 λ™μΌν•œ λ‹¨μœ„λ₯Ό μ‚¬μš©ν•˜λŠ” κΈ€λ¦¬ν”„μ˜ μ§μ‚¬κ°ν˜• λ‚΄μ˜ x/y μ’Œν‘œμž…λ‹ˆλ‹€. κ·Έ x/y의 λ„ν•¨μˆ˜λŠ” 쑰각 μ‚¬μ΄μ˜ 잠재적인 이동 속도λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. μ „μ²΄μ μœΌλ‘œ distance λ₯Ό μ‚¬μš©ν•˜λŠ” 것보닀 더 λ‚˜μ€ κ²°κ³Όλ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. μ΄λŠ” 글리프 μ „μ²΄μ˜ _κ· μΌν•œ_ λ³€ν™”μœ¨μ„ 기반으둜 ν•˜κΈ° λ•Œλ¬Έμ— μš°λ¦¬λŠ” μ•„ν‹°νŒ©νŠΈλ₯Ό 얻지 λͺ»ν•˜κ³  μž‘μ€ ν¬κΈ°μ—μ„œ 더 μ •ν™•ν•©λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ λ³΄μ•˜λ“―μ΄ λΆ„ν•΄λ˜λŠ” μœ„μΉ˜λŠ” λΉ„μŠ€λ“¬ν•œ κ°λ„μž…λ‹ˆλ‹€. μ΄λŸ¬ν•œ 경우 수직의 잠재적 x/y λ³€ν™”μœ¨μ€ μˆ˜ν‰μ˜ 그것과 훨씬 λ‹€λ¦…λ‹ˆλ‹€. κ·Έλž˜μ„œ μš°λ¦¬λŠ” ν•œ λ°©ν–₯μ—μ„œλŠ” λ„ˆλ¬΄ 크고 λ‹€λ₯Έ λ°©ν–₯μ—μ„œλŠ” λ„ˆλ¬΄ μž‘μ€ 잠재적 λ³€ν™”μœ¨μ— λŒ€ν•΄ 단일 값을 μ‚¬μš©ν•˜κ²Œ λ˜μ–΄ ν•΄λ‹Ή λ‹¨νŽΈμ—μ„œ SDF의 μ‹€μ œ λ³€κ²½ λ°©ν–₯에 따라 νλ¦Ών•˜κ±°λ‚˜ κ³ λ₯΄μ§€ λͺ»ν•œ 선을 μ œκ³΅ν•©λ‹ˆλ‹€.

예, κ²½μ‚¬μ˜ 경우 ν™•μ‹€νžˆ κ°œμ„ ν•  여지가 μžˆμ§€λ§Œ distance 의 미뢄을 μ‚¬μš©ν•˜λŠ” κ²ƒλ§ŒμœΌλ‘œλŠ” μΆ©λΆ„ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” λ¬Όλ‘  이것을 κ°œμ„ ν•˜κΈ° μœ„ν•œ 아이디어에 μ—΄λ € μžˆμŠ΅λ‹ˆλ‹€. ν•œ 가지 κ°€λŠ₯성은 μ‹œλ‚˜λ¦¬μ˜€(경사에 κ°€κΉŒμš΄ 큰 ν…μŠ€νŠΈ 크기, λΉ„μŠ€λ“¬ν•œ 각도)λ₯Ό κ°μ§€ν•˜κ³  distance νŒŒμƒ μƒν’ˆμ„ 이 κ²½μš°μ—λ§Œ μ‚¬μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

λ„€, μƒκ°λ§Œ 해도 ν˜Όλž€μŠ€λŸ½λ„€μš”, ν•˜ν•˜. λ””μŠ€ν„΄μŠ€ ν•„λ“œκ°€ 덜 λΆ€λ“œλŸ½λ‹€λŠ” 것을 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.

μ΄λŸ¬ν•œ κΈ€λ¦¬μΉ˜ 픽셀은 μ™ΈλΆ€ 쑰각에 μ΄μƒν•œ 거리 값이 있기 λ•Œλ¬ΈμΌ 수 μžˆμŠ΅λ‹ˆλ‹€.

λ©€λ¦¬μ„œ 보면 μ—„μ²­λ‚˜κ²Œ κ³ λ₯΄μ§€ λͺ»ν•˜μ§€λ§Œ UVκ°€ 더 μ’‹μ•„μ§€λŠ” 것을 ν™•μ‹€νžˆ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. μ•„λ§ˆλ„ 카메라 거리에 따라 거리 λ³€μˆ˜μ™€ UV 사이λ₯Ό λ³΄κ°„ν•˜λŠ” 것이 잘 μž‘λ™ν•  κ²ƒμž…λ‹ˆλ‹€. κ°€κΉŒμšΈ λ•Œ 더 λ§Žμ€ fwidth(distance)λ₯Ό μ„ νƒν•˜κ³  멀리 μžˆμ„ λ•Œ 더 λ§Žμ€ fwidth(uv)λ₯Ό μ„ νƒν•©λ‹ˆλ‹€.

비ꡐλ₯Ό μœ„ν•΄(μ •ν™•νžˆ λ™μΌν•œ 카메라 μœ„μΉ˜μ™€ λ°©ν–₯μ—μ„œ 두 개λ₯Ό μΊ‘μ²˜ν•˜μ§€ μ•Šμ•˜μ§€λ§Œ μ–΄μ¨Œλ“  차이λ₯Ό 잘 λ³΄μ—¬μ£ΌλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€):
거리(0.8 κ³„μˆ˜):
image
UV:
image

이 μˆ˜μ •μœΌλ‘œ μ‚¬μš©μž μ •μ˜ ν…μŠ€νŠΈ λ³€ν™˜μ˜ ​​결과가 크게 ν–₯μƒλ˜μ—ˆμŒμ„ μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€. λ‹€μŒμ€ createDerivedMaterial λ₯Ό μ‚¬μš©ν•˜μ—¬ 곑선을 λ”°λ₯΄λ„둝 μˆ˜μ •λœ 일뢀 ν…μŠ€νŠΈμž…λ‹ˆλ‹€( 이 기술 μ°Έμ‘° ). 이것은 ν˜„μž¬ troika-three-text shaderλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

image

λ‹€μŒμ€ λ™μΌν•œ μŠ€ν¬λ¦°μƒ·μ΄μ§€λ§Œ @asbjornlystrup 을 troikaGetAADist 둜 μˆ˜μ •ν–ˆμŠ΅λ‹ˆλ‹€.

image

두 번째 μž₯λ©΄μ—μ„œλŠ” μ—„μ²­λ‚˜κ²Œ λŠ˜μ–΄μ§„ "GREAT!"λ₯Ό λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. μ’€ 더 λ°”μ‚­ν•˜λ‹€.

μΌν™”μ μœΌλ‘œ: λ‚˜λŠ” λ˜ν•œ μƒμˆ˜λ₯Ό 0.25(0.5μ—μ„œ)둜 μ‘°μ •ν•˜λ©΄ 멋진 μ„ λͺ…ν•œ κ°€μž₯μžλ¦¬λ„ λ§Œλ“ λ‹€λŠ” 것을 λ°œκ²¬ν–ˆμŠ΅λ‹ˆλ‹€.

return length(fwidth(vTroikaGlyphUV * vTroikaGlyphDimensions)) * 0.25;

@canadaduane 덕뢄에 λŠ˜μ–΄λ‚œ 뢀뢄이 ν™•μ‹€νžˆ κ°œμ„ λœ 것을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ HELLO의 L 사이에 λͺ»μƒκΈ΄ μ•„ν‹°νŒ©νŠΈκ°€ λ‚˜νƒ€λ‚˜λŠ” 것을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. 이 λ³€κ²½ 사항을 μ μš©ν•˜κΈ° 전에 λ°˜λ“œμ‹œ νŒŒμ•…ν•΄μ•Ό ν•©λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰