μ λ μ΄μ λ²μ μ μ¬μ©νκ³ μκΈ° λλ¬Έμ μ΅κ·Όμ μ€ν°μ¨λ¦¬μ΄μ± μ½λλ₯Ό μ λ°μ΄νΈνλμ§ νμ€νμ§ μμ§λ§ μ °μ΄λλ‘ κ·Έλ¦° μμ μ€ν°μ¨λ¦¬μ΄μ±μ μννλ μ’μ λ°©λ²μ μ°Ύμ ν ν μ€νΈμλ μλν΄ λ³΄κ³ μΆμμ΅λλ€. , ν μ€νΈκ° SDF κΈ°λ°μ΄κ³ μμ μ€ν°μ¨λ¦¬μ΄μ±λ 거리 κΈ°λ°μ΄κΈ° λλ¬Έμ λλ€.
λ΄ νμ¬ λ²μ μ Troikaμμλ aa 거리μ λν΄ return length(fwidth(vTroikaGlyphUV * vTroikaGlyphDimensions)) * 0.5;
λ₯Ό μνν©λλ€. μ΄κ²μ λΉμ€λ¬ν λ³Ό λ κ°μ₯ μΌμͺ½κ³Ό κ°μ₯ μ€λ₯Έμͺ½ κ°μ₯μλ¦¬κ° λ€μ λμ λκ² νλ €μ§λ μν°ν©νΈκ° μμ΅λλ€.
μ€μΉΌλΌλ‘ λ³κ²½νμ΅λλ€. λ΄ μν΄ μ½λμ κ°μ 거리: return fwidth(distance) * 0.5;
troikaGetFragDistValue
μμ μ λ¬λ 거리μ ν¨κ»: float distance = troikaGetFragDistValue();
float aaDist = troikaGetAADist(distance);
μ΄λ κ²νλ©΄ νλ¦Ών μν°ν©νΈκ° λ°μνμ§ μμ΅λλ€.
λ λΆλλ¬μ΄ μ€ν°μ¨λ¦¬μ΄μ±μ μν΄ 0.5
μμλ₯Ό λ릴 μ μμ΅λλ€. μ: 0.8
:
μ μ²λΌ μ΄ λ°©λ²μ λͺ¨λ₯΄μλ λΆλ€μ΄ κ³μ€κΉλ΄ 곡μ ν΄λ΄ λλ€. λ΄ "ꡬν"μλ λͺ κ°μ§ μ΄μν μν°ν©νΈκ° μμΌλ©°(μλ μ°Έμ‘°) μλ§λ μ΄κ²μ΄ λΉμ μ΄ λ€λ₯Έ λ°©λ²μ μ νν μ΄μ μΌ κ²μ λλ€. λν μ °μ΄λ μ½λμμ aaDist λ³μλ₯Ό μ¬μ©νλ λ°©λ²μ μ νν μμ§ λͺ»νλ―λ‘ μ΄λ₯Ό ꡬννλ λ° λ λ₯μν μ μμ΅λλ€. μλ₯Ό λ€μ΄ μ΄ λ³κ²½μΌλ‘ μΈν΄ λ³κ²½νκ±°λ μ κ±°ν΄μΌ νλ μΌλΆ μ½λκ° μμ μ μμ΅λλ€. μ΄ μ½λλ "ꡬν"μ λμ± ν₯μμν¬ μ μμ΅λλ€.
bgolusμ κ²μλ¬Όμμ μ΄ λ°©λ²μ μ°Ύμμ΅λλ€. https://forum.unity.com/threads/antialiasing-circle-shader.432119/ λ λ§μ μ λ³΄κ° μμ΅λλ€. κ·Έλ λν λ λμ μ λ°λλ₯Ό μν΄ fwidth(distance)
length(vec2(dFdx(distance), dFdy(distance)))
λ₯Ό ν μ μλ€κ³ λ§νμ§λ§ μ΄κ²μ΄ 무μν μ μλμ§ μ¬λΆλ νμ€νμ§ μμ΅λλ€.
μ μ κ°μ¬ν©λλ€! λλ λΉμ€λ¬ν κ°λμμλ νλ¦Ών κ°μ₯μ리λ₯Ό λ°κ²¬νκ³ μ κ±°νκ³ μΆκΈ° λλ¬Έμ μ΄κ²μ νμ€ν μ‘°μ¬ν κ²μ λλ€.
μ΄λ‘ μ μΌλ‘ 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 κ³μ):
UV:
μ΄ μμ μΌλ‘ μ¬μ©μ μ μ ν
μ€νΈ λ³νμ ββκ²°κ³Όκ° ν¬κ² ν₯μλμμμ μ μ μμ΅λλ€. λ€μμ createDerivedMaterial
λ₯Ό μ¬μ©νμ¬ κ³‘μ μ λ°λ₯΄λλ‘ μμ λ μΌλΆ ν
μ€νΈμ
λλ€( μ΄ κΈ°μ μ°Έμ‘° ). μ΄κ²μ νμ¬ troika-three-text shaderλ₯Ό μ¬μ©ν©λλ€.
λ€μμ λμΌν μ€ν¬λ¦°μ·μ΄μ§λ§ @asbjornlystrup μ troikaGetAADist
λ‘ μμ νμ΅λλ€.
λ λ²μ§Έ μ₯λ©΄μμλ μμ²λκ² λμ΄μ§ "GREAT!"λ₯Ό λ³Ό μ μμ΅λλ€. μ’ λ λ°μνλ€.
μΌνμ μΌλ‘: λλ λν μμλ₯Ό 0.25(0.5μμ)λ‘ μ‘°μ νλ©΄ λ©μ§ μ λͺ ν κ°μ₯μ리λ λ§λ λ€λ κ²μ λ°κ²¬νμ΅λλ€.
return length(fwidth(vTroikaGlyphUV * vTroikaGlyphDimensions)) * 0.25;
@canadaduane λλΆμ λμ΄λ λΆλΆμ΄ νμ€ν κ°μ λ κ²μ λ³Ό μ μμ΅λλ€. λν HELLOμ L μ¬μ΄μ λͺ»μκΈ΄ μν°ν©νΈκ° λνλλ κ²μ λ³Ό μ μμ΅λλ€. μ΄ λ³κ²½ μ¬νμ μ μ©νκΈ° μ μ λ°λμ νμ ν΄μΌ ν©λλ€.