Material - kuimoani/defold GitHub Wiki

Materials

메터리얼은 κ·Έλž˜ν”½ μ»΄ν¬λ„ŒνŠΈλ“€(μŠ€ν”„λΌμ΄νŠΈ, 타일맡, 폰트, GUIλ…ΈνŠΈ λ“±)을 μ–΄λ–»κ²Œ λ Œλ”λ§λ˜μ–΄ ν‘œν˜„ν•˜λŠ”μ§€ Defold의 λ°©μ‹μž…λ‹ˆλ‹€. 이 맀뉴얼은 메터리얼(materials), 쉐이더 μƒμˆ˜(shader constants), μƒ˜ν”ŒλŸ¬(samplers) 듀이 μ–΄λ–»κ²Œ λ™μž‘ν•˜λŠ”μ§€ μ„€λͺ…ν•©λ‹ˆλ‹€.

Overview

메터리얼은 λ Œλ”λ§ ν•  였브젝트λ₯Ό μ„ νƒν•˜κΈ° μœ„ν•΄ λ Œλ”λ§ νŒŒμ΄ν”„ 라인(rendering pipeline)에 μ‚¬μš©λ˜λŠ” 정보인 Tagsλ₯Ό ν¬ν•¨ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ μ‚¬μš© κ°€λŠ₯ν•œ κ·Έλž˜ν”½ APIλ₯Ό 톡해 컴파일 된 ν›„ 각 ν”„λ ˆμž„λ§ˆλ‹€ μ»΄ν¬λ„ŒνŠΈκ°€ λ Œλ”λ§λ  λ•Œ κ·Έλž˜ν”½ ν•˜λ“œμ›¨μ–΄μ—μ„œ μ‹€ν–‰λ˜λŠ” 쉐이더 ν”„λ‘œκ·Έλž¨μ— λŒ€ν•œ 참쑰도 ν¬ν•¨ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. λ²„ν…μŠ€ 쉐이더(vertex shader)λŠ” μ»΄ν¬λ„ŒνŠΈμ˜ κΈ°ν•˜ ꡬ쑰(geometry)λ₯Ό κ³„μ‚°ν•˜λ©°, μ΄λŠ” 였브젝트의 각 λ²„ν…μŠ€λ₯Ό μ „λ‹¬ν•˜κΈ° 전에 μž‘μ—…μ„ μˆ˜ν–‰ν•˜κ²Œ λ©λ‹ˆλ‹€. 계산 결과둜 λ§Œλ“€μ–΄μ§„ 기초 μš”μ†Œ(primitives)λŠ” λž˜μŠ€ν„°(rasterized)ν™” λ˜κ±°λ‚˜ fragment(쑰각) ν˜Ήμ€ ν”½μ…€λ‘œ λ‚˜λˆ μ§€κ²Œ λ©λ‹ˆλ‹€. 이듀 각각의 ν”„λž˜κ·Έλ¨ΌνŠΈλ“€μ€ ν”„λž˜κ·Έλ¨ΌνŠΈ 쉐이더(fragment shader: λ•Œλ‘œλŠ” ν”½μ…€ 쉐이더라고도 뢈림)λ₯Ό ν†΅ν•˜μ—¬ μ‹€ν–‰λ©λ‹ˆλ‹€. 이 ν”„λž˜κ·Έλ¨ΌνŠΈ μ‰μ΄λ”μ˜ λͺ©μ μ€ κ²°κ³Ό ν”½μ…€(resulting pixel)의 색상을 κ²°μ •ν•˜λŠ” 것이며, μ–΄λ–€ λ°©μ‹μœΌλ‘œλ“  계산(calculation), ν…μŠ€μ³ 쑰회(texture lookup), μ‘°ν•©(combinations)에 μ˜ν•΄ μˆ˜ν–‰λ  수 μžˆμŠ΅λ‹ˆλ‹€.

Shaders in OpenGL

DefoldλŠ” λͺ¨λ°”일 μž₯μΉ˜μ—μ„œ λ Œλ”λ§ ν•˜κΈ° μœ„ν•΄ OpenGL ES 2.0을 μ‚¬μš©ν•©λ‹ˆλ‹€. λ°μŠ€ν¬νƒ‘ ν™˜κ²½μ—μ„œλŠ” 보톡 λ‹€λ₯Έ λ²„μ „μ˜ OpenGL이 μ‚¬μš©λ˜μ§€λ§Œ, μš”μ¦˜μ˜ ν•˜λ“œμ›¨μ–΄μ™€ λ“œλΌμ΄λ²„λŠ” μ μ ˆν•˜κ²Œ ν˜Έν™˜λ˜κ³  μžˆμŠ΅λ‹ˆλ‹€. OpenGL ES 2.0 (μž„λ² λ””λ“œ μ‹œμŠ€ν…œμ„ μœ„ν•œ OpenGL) κ³Ό OpenGL ES 쉐이딩 μ–Έμ–΄μ˜ μžμ„Έν•œ 사양은 https://www.khronos.org/registry/gles/ μ—μ„œ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

λ°μŠ€ν¬νƒ‘ ν™˜κ²½μ—μ„œλŠ” OpenGL ES 2.0 μ—μ„œ μ§€μ›λ˜μ§€ μ•ŠλŠ” κΈ°λŠ₯을 μ‚¬μš©ν•˜μ—¬ 쉐이더λ₯Ό λ§Œλ“€κ³  컴파일 ν•˜λŠ” 것이 κ°€λŠ₯ν•©λ‹ˆλ‹€. λ‹€λ§Œ μ΄λ ‡κ²Œ ν•˜λ©΄ μƒν˜Έ ν˜Έν™˜μ΄ 깨질 수 μžˆμŠ΅λ‹ˆλ‹€.

Creating a material

자, λ‹¨μˆœν•œ 평면(μ§€ν–₯μ„± λΉ›(directional light)이 μ—†λŠ”)μ΄μ§€λ§Œ 질감이 μžˆλŠ” 메터리얼(textured material)을 λ§Œλ“€μ–΄ λ΄…μ‹œλ‹€.

  1. Project Explorer μ°½μ—μ„œ λŒ€μƒ 폴더λ₯Ό μ„ νƒν•©λ‹ˆλ‹€.
  2. File > New…​ > Material File 메뉴λ₯Ό μ„ νƒν•©λ‹ˆλ‹€. (Project Explorer μ°½μ—μ„œ 였λ₯Έμͺ½ 클릭 ν›„ New…​ > Material File을 선택해도 λ©λ‹ˆλ‹€.)
  3. μƒˆ 메터리얼 파일의 이름을 μ§€μ •ν•©λ‹ˆλ‹€.
  4. μƒˆ 메터리얼을 Material Editorμ—μ„œ μ—½λ‹ˆλ‹€.

Material editor

이제 λ²„ν…μŠ€(vertex)와 ν”„λ ˆκ·Έλ¨ΌνŠΈ 쉐이더(fragment shader) ν”„λ‘œκ·Έλž¨ νŒŒμΌμ„ λ§Œλ“€μ–΄μ•Ό ν•©λ‹ˆλ‹€. ν˜„μž¬ 이 μž‘μ—… λ‹¨κ³„λŠ” μ’€ λ³΅μž‘ν•©λ‹ˆλ‹€.

  1. File > New…​ > Script File 을 μ„ νƒν•΄μ„œ 슀크립트 파일 λ§Œλ“€κΈ°
  2. 이 슀크립트 파일의 ν™•μž₯자λ₯Ό ".vp" (Vertex Program)둜 λ°”κΏ‰λ‹ˆλ‹€.
  3. 슀크립트 νŒŒμΌμ„ ν•˜λ‚˜ 더 λ§Œλ“­λ‹ˆλ‹€.
  4. 이 슀크립트 파일의 ν™•μž₯자λ₯Ό ".fp" (Fragment Program)둜 λ°”κΏ‰λ‹ˆλ‹€.

λ©”ν„°λ¦¬μ–Όμ˜ μ•„λž˜ 속성을 μ‚¬μš©ν•˜μ—¬ μ„œλ‘œ μ—°κ΄€λœ 두 ν”„λ‘œκ·Έλž¨ νŒŒμΌμ„ μ§€μ •ν•©λ‹ˆλ‹€.

Shader files

Material tags

λ‹Ήμ‹ μ˜ λ Œλ” 슀크립트(render script)κ°€ μƒˆ 메터리얼을 μ‚¬μš©ν•˜λŠ” μ»΄ν¬λ„ŒνŠΈλ₯Ό λ Œλ”λ§ ν•  수 μžˆμœΌλ―€λ‘œ 당신은 메터리얼을 μœ„ν•œ νƒœκ·Έ(tag)λ₯Ό μ„€μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€. νƒœκ·ΈλŠ” μ—”μ§„μ—μ„œ render.predicate()에 μ˜ν•΄ ν•¨κ»˜ λ Œλ”λ§ν•΄μ•Ό ν•˜λŠ” μ»΄ν¬λ„ŒνŠΈλ“€μ„ μˆ˜μ§‘ν•˜κΈ°μœ„ν•΄ μ‚¬μš©λ˜λ©° λΉ„νŠΈλ§ˆμŠ€ν¬(bitmask)둜 ν‘œμ‹œλ©λ‹ˆλ‹€. 이λ₯Ό μˆ˜ν–‰ν•˜λŠ” 방법을 μ•Œκ³  μ‹Άλ‹€λ©΄ Renderingλ¬Έμ„œλ₯Ό μ°Έκ³  λ°”λžλ‹ˆλ‹€.

ν”„λ‘œμ νŠΈμ—μ„œ μ‚¬μš©ν•  수 μžˆλŠ” μ΅œλŒ€ νƒœκ·Έμ˜ μˆ˜λŠ” 32개 μž…λ‹ˆλ‹€.

Material tags

Constants

λ²„ν…μŠ€ μ‰μ΄λ”λŠ” 각 λ²„ν…μŠ€κ°€ 클리핑 곡간(clipping space)으둜 λ°”λ€” 수 μžˆλ„λ‘ λ©”νŠΈλ¦­μŠ€λ₯Ό ν•„μš”λ‘œ ν•˜λ©° 두 개의 λ²„ν…μŠ€ μƒμˆ˜(vertex constants)λ₯Ό μ„€μ •ν•˜λ©΄ λ©λ‹ˆλ‹€.

  1. μƒμˆ˜ ν•œ κ°œλŠ” "world"둜 이름을 μ§“κ³  type을 CONSTANT_TYPE_WORLD 둜 μ„€μ •ν•©λ‹ˆλ‹€. 이λ₯Ό 톡해 엔진은 "world"κ°€ μ›”λ“œ λ©”νŠΈλ¦­μŠ€λ₯Ό ν¬ν•¨ν•˜κ³  μžˆλ‹€λŠ” 것을 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.
  2. λ‘λ²ˆμ§ΈλŠ” "view_proj"둜 이름을 μ§“κ³  type을 CONSTANT_VIEW_PROJECTION 으둜 μ„€μ •ν•©λ‹ˆλ‹€. 이λ₯Ό 톡해 엔진은 "view_proj"κ°€ ν”„λ‘œμ μ…˜ λ©”νŠΈλ¦­μŠ€(projection matrix)와 κ³±ν•΄μ§„ λ·° λ©”νŠΈλ¦­μŠ€(view matrix)λ₯Ό ν¬ν•¨ν•˜κ³  μžˆλ‹€λŠ” 것을 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.

Vertex constants

Shader programs

메터리얼이 λ™μž‘ν•˜κΈ° μœ„ν•΄μ„œ, μš°λ¦¬λŠ” λ²„ν…μŠ€μ™€ 쉐이더 ν”„λ‘œκ·Έλž¨μ„ μˆ˜μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€.

Vertex shader ("flat.vp")

// view_proj 와 world λŠ” λ²„ν…μŠ€ μƒμˆ˜λ‘œ μ„€μ •λ˜λ©°
// μš°λ¦¬λŠ” λ²„ν…μŠ€ 쉐이더 ν”„λ‘œκ·Έλž¨μ—μ„œ 이λ₯Ό "uniform"으둜 μ„ μ–Έν•˜μ—¬ μ—‘μ„ΈμŠ€ν•¨
//
uniform mediump mat4 view_proj;
uniform mediump mat4 world;

// position이 μ›λž˜μ˜ λ²„ν…μŠ€ ν¬μ§€μ…˜μ„ μœ μ§€ν•¨
attribute mediump vec4 position;

// texcoord0 λŠ” 이 λ²„ν…μŠ€λ₯Ό μœ„ν•΄ ν…μŠ€μ³ μ’Œν‘œλ₯Ό κ°€μ§€κ³  있음
attribute mediump vec2 texcoord0;

// λ²„ν…μŠ€ κ°„μ˜ ν…μŠ€μ³ μ’Œν‘œλ₯Ό λ³΄κ°„ν•˜λŠ” λ³€μˆ˜λ₯Ό μ •μ˜ν•¨
// ν”„λ ˆκ·Έλ¨ΌνŠΈ 쉐이더(fragment shader)λŠ” 이 값을 읽게됨
varying mediump vec2 var_texcoord0;

void main()
{
	// view, projection, world λ©”νŠΈλ¦­μŠ€λ₯Ό ν•˜λ‚˜λ‘œ 곱함
    mediump mat4 mvp = view_proj * world;

    // var_texcoord0에 이 λ²„ν…μŠ€μ˜ μœ„μΉ˜μΈ texcoord0λ₯Ό 섀정함
	var_texcoord0 = texcoord0;

    // λ²„ν…μŠ€ μœ„μΉ˜λ₯Ό mvp matrix둜 이동(translate)함
	// vec4(position.xyz, 1.0) λŠ” 이 μœ„μΉ˜μ˜ w μ»΄ν¬λ„ŒνŠΈκ°€ 항상 1.0μž„μ„ 보μž₯함
    gl_Position = mvp * vec4(position.xyz, 1.0);
}

Fragment shader ("flat.fp")

// 이 ν”„λ ˆκ·Έλ¨ΌνŠΈμ˜ ν…μŠ€μ³ μ’Œν‘œλŠ” λ²„ν…μŠ€ 사이에 λ‹€μ–‘ν•˜κ²Œ 있음
varying mediump vec2 var_texcoord0;

// μ»΄ν¬λ„ŒνŠΈμ˜ ν…μŠ€μ³ λ°μ΄ν„°λŠ” sampler2Dλ₯Ό 톡해 μ•‘μ„ΈμŠ€λ¨
uniform sampler2D diffuse_texture;

void main()
{
	// 이 ν”„λ ˆκ·Έλ¨ΌνŠΈ μ’Œν‘œμ—μ„œ ν…μŠ€μ³μ˜ 색상을 μ°Ύκ³  이λ₯Ό ν”„λ ˆκ·Έλ¨ΌνŠΈ μƒ‰μƒμœΌλ‘œ 섀정함
    gl_FragColor = texture2D(diffuse_texture, var_texcoord0);
}

Setting the material

각 κ·Έλž˜ν”½ 였브젝트의 νƒ€μž…μ€ Material 속성을 κ°€μ§€κ³  있으며 각 μ»΄ν¬λ„ŒνŠΈλ§ˆλ‹€ νŠΉμ • 메터리얼을 μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 메터리얼을 μ„€μ •ν•˜μ§€ μ•ŠμœΌλ©΄, κΈ°λ³Έ 메터리얼이 μžλ™μœΌλ‘œ μ„ νƒλ©λ‹ˆλ‹€. 직접 μƒˆλ‘œ λ§Œλ“  메터리얼을 μ‚¬μš©ν•˜μ—¬ λͺ¨λΈ λ Œλ”(model render)λ₯Ό λ§Œλ“€κΈ° μœ„ν•΄μ„œλŠ”, Material 속성을 μ„€μ •ν•˜μ—¬ 메터리얼 νŒŒμΌμ„ μ°Έμ‘°ν•˜λ©΄ λ©λ‹ˆλ‹€. Models λ¬Έμ„œμ—μ„œ μ–΄λ–»κ²Œ 3D λͺ¨λΈμ„ Defold둜 μž„ν¬νŠΈ ν•˜λŠ”μ§€ κ°€μ΄λ“œλ₯Ό λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

Set material

이제 λͺ¨λΈμ˜ κ²°κ³Ό λ Œλ”λ§μ„ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. μƒμƒν•œ 만큼의 ν₯미둜운 메터리얼은 μ•„λ‹ˆμ§€λ§Œ, κ²½ν—˜μ„ μŒ“κΈ°μ—” 쒋은 좜발점이 될 κ²ƒμž…λ‹ˆλ‹€. λ§Œμ•½ 당신이 쉐이더 ν”„λ‘œκ·Έλž˜λ°μ„ 처음 μ‹œμž‘ν•œλ‹€λ©΄, λ Œλ”λ§ νŒŒμ΄ν”„λΌμΈμ΄ λ™μž‘ν•˜λŠ” 방법을 μ΄ν•΄ν•˜κΈ° μœ„ν•΄ 이 κ°„λ‹¨ν•œ μƒ˜ν”Œμ— μ‹œκ°„μ„ λ“€μ—¬μ•Ό ν•©λ‹ˆλ‹€.

Flat shaded model

Shader constants

μœ λ‹ˆνΌ(Uniforms)은 μ—”μ§„μ—μ„œ λ²„ν…μŠ€μ™€ ν”„λ ˆκ·Έλ¨ΌνŠΈ 쉐이더 ν”„λ‘œκ·Έλž¨μœΌλ‘œ μ „λ‹¬λ˜λŠ” κ°’μž…λ‹ˆλ‹€. 이듀은 쉐이더 ν”„λ‘œκ·Έλž¨μ—μ„œ uniform ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλ˜λ©° material νŒŒμΌμ—μ„œ vertex_constant μ†μ„±μ΄λ‚˜ fragment_constant μ†μ„±μœΌλ‘œ μ •μ˜λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€. 쉐이더 μƒμˆ˜(shader constatns)λŠ” 각 λ Œλ” 패슀(render pass)μ—μ„œ μΌμ •ν•˜λ©° 각 ν”„λ ˆμž„λ‹Ή ν•œ λ²ˆμ”© λ°œμƒν•©λ‹ˆλ‹€. μ•„λž˜ νƒ€μž…μ„ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

CONSTANT_TYPE_USER

쉐이더 ν”„λ‘œκ·Έλž¨μœΌλ‘œ λ³΄λ‚΄λ €λŠ” μ»€μŠ€ν…€ 데이터λ₯Ό μœ„ν•΄ μ‚¬μš©λ˜λŠ” μ»€μŠ€ν…€ μƒμˆ˜(custom constant)μž…λ‹ˆλ‹€. μƒμˆ˜ μ •μ˜(constant definition)에 μžˆλŠ” μƒμˆ˜λ₯Ό μ΄ˆκΈ°κ°’μœΌλ‘œ μ‚¬μš©ν•  수 μžˆμ§€λ§Œ sprite.set_constant(), sprite.reset_constant(), tilemap.set_constant(), tilemap.reset_constant(), particlefx.set_constant(), particlefx.reset_constant() ν•¨μˆ˜λ₯Ό 톡해 λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

CONSTANT_TYPE_WORLD

μ›”λ“œ λ©”νŠΈλ¦­μŠ€(world matrix)

CONSTANT_TYPE_VIEW

λ·° λ©”νŠΈλ¦­μŠ€(view matrix)

CONSTANT_TYPE_PROJECTION

ν”„λ‘œμ μ…˜ λ©”νŠΈλ¦­μŠ€(projection matrix)

CONSTANT_TYPE_VIEWPROJ

뷰와 ν”„λ‘œμ μ…˜ λ©”νŠΈλ¦­μŠ€λ₯Ό κ³±ν•œ λ©”νŠΈλ¦­μŠ€

CONSTANT_TYPE_WORLDVIEW

μ›”λ“œμ™€ 뷰와 ν”„λ‘œμ μ…˜ λ©”νŠΈλ¦­μŠ€λ₯Ό κ³±ν•œ λ©”νŠΈλ¦­μŠ€

Constant buffers

λ Œλ”λ§ νŒŒμ΄ν”„λΌμΈ(rendering pipeline)이 그리기 μž‘μ—…μ„ ν•  λ•ŒλŠ” κΈ°λ³Έ μ‹œμŠ€ν…œ μƒμˆ˜ 버퍼(default system constants buffer)μ—μ„œ μƒμˆ˜κ°’λ“€μ„ κ°€μ Έμ˜΅λ‹ˆλ‹€. μ»€μŠ€ν…€ μƒμˆ˜ λ²„νΌλŠ” κΈ°λ³Έ μƒμˆ˜κ°’μ„ μ˜€λ²„λΌμ΄λ”©(override) ν•˜λŠ”λ° μ‚¬μš©λ˜λ©°, λŒ€μ‹  λ Œλ” 슀크립트(render script)μ—μ„œ 쉐이더 ν”„λ‘œκ·Έλž¨ λ³€μˆ˜λ₯Ό ν”„λ‘œκ·Έλž˜λ° λ°©μ‹μœΌλ‘œ μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 그리고 λ‚˜μ„œ 이듀은 render.draw() ν•¨μˆ˜λ‘œ 전달 λ©λ‹ˆλ‹€.

self.constants = render.constant_buffer() 					[1]
self.constants.tint = vmath.vector4(1, 0, 0, 1) 			[2]
...
render.draw(self.my_pred, self.constants) 					[3]
  • [1] μƒˆλ‘œμš΄ μƒμˆ˜ 버퍼λ₯Ό λ§Œλ“¬
  • [2] "tint" μƒμˆ˜λ₯Ό 밝은 λΉ¨κ°•μƒ‰μœΌλ‘œ μ„€μ •
  • [3] 우리의 μ»€μŠ€ν…€ μƒμˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ predicate 그리기

λ²„νΌμ˜ μƒμˆ˜ μš”μ†Œ(element)λŠ” Lua ν…Œμ΄λΈ”μ²˜λŸΌ 인덱슀 될 수 μžˆμ§€λ§Œ pairs() λ‚˜ ipairs() 둜 반볡 ν•  수 λŠ” μ—†μŠ΅λ‹ˆλ‹€.

Uniform texture samplers

μ„ μ–Έλœ sampler 2DλŠ” μžλ™μ μœΌλ‘œ κ·Έλž˜ν”½ μ»΄ν¬λ„ŒνŠΈμ— 참쑰된 ν…μŠ€μ³μ— 바인딩 λ©λ‹ˆλ‹€. ν˜„μž¬λŠ” 메터리얼 νŒŒμΌμ— μƒ˜ν”ŒλŸ¬λ₯Ό μ§€μ •ν•  ν•„μš”κ°€ μ—†μ§€λ§Œ, μ›ν•˜λŠ” 경우 μƒ˜ν”ŒλŸ¬λ₯Ό μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ•„λž˜λ₯Ό μ°Έκ³  λ°”λžλ‹ˆλ‹€.

Component texture

// μ»΄ν¬λ„ŒνŠΈμ˜ ν…μŠ€μ³ λ°μ΄ν„°λŠ” sampler2Dλ₯Ό 톡해 μ•‘μ„ΈμŠ€λ¨
uniform sampler2D diffuse_texture;
...

// 이 ν”„λ ˆκ·Έλ¨ΌνŠΈ μ’Œν‘œμ—μ„œ ν…μŠ€μ³ 색을 νƒμƒ‰ν•˜κ³ 
// 이 μƒ‰μœΌλ‘œ ν”„λ ˆκ·Έλ¨ΌνŠΈ 색을 섀정함
gl_FragColor = texture2D(diffuse_texture, var_texcoord0);
...

ν˜„μž¬ DefoldλŠ” 메터리얼 λ‹Ή ν•œ 개의 ν…μŠ€μ³λ§Œ μ§€μ›ν•©λ‹ˆλ‹€

Sampler settings

당신은 μ„ νƒμ μœΌλ‘œ 메터리얼 νŒŒμΌμ— νŠΉμ • μƒ˜ν”ŒλŸ¬λ₯Ό μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μƒ˜ν”ŒλŸ¬μ—μ„œ 쉐이더 ν”„λ‘œκ·Έλž¨μ—μ„œ μ‚¬μš©λœ 이름을 따라 이름을 μ •ν•˜κ³  wrapκ³Ό filterλ₯Ό μ›ν•˜λŠ” λŒ€λ‘œ μ„€μ •ν•˜λ©΄ λ©λ‹ˆλ‹€.

Sampler settings

Wrap modes

wrap λͺ¨λ“œλŠ” U 및 V 좕을 λ…λ¦½μ μœΌλ‘œ μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

WRAP_MODE_REPEAT

[0,1] λ²”μœ„ λ°–μ˜ ν…μŠ€μ³ 데이터가 반볡됨

WRAP_MODE_MIRRORED_REPEAT

[0,1] λ²”μœ„ λ°–μ˜ ν…μŠ€μ³ 데이터가 λ°˜λ³΅λ˜μ§€λ§Œ λͺ¨λ“  λ‘λ²ˆμ§Έμ˜ λ°˜λ³΅μ€ 미러링됨

WRAP_MODE_CLAMP_TO_EDGE

1.0보닀 큰 κ°’μ˜ ν…μŠ€μ³ λ°μ΄ν„°λŠ” 1.0으둜 μ„€μ •λ˜κ³  0.0보닀 μž‘μ€ 값은 0.0으둜 섀정됨 (예λ₯Ό λ“€μ–΄ κ°€μž₯자리의 ν”½μ…€(edge pixel)은 κ°€μž₯자리둜 반볡됨)

Filter modes

ν™•λŒ€(filter_mag)와 μΆ•μ†Œ(filter_min)λ₯Ό κ°œλ³„μ μœΌλ‘œ 필터링 ν•˜κΈ° μœ„ν•œ 섀정을 ν•  수 μžˆμŠ΅λ‹ˆλ‹€. Nearest 필터링은 Linear interpolation(μ„ ν˜• 보간)에 λΉ„ν•΄ 계산을 적게 ν•˜μ§€λ§Œ 계단 ν˜„μƒ(aliasing artifacts)이 λ‚˜νƒ€λ‚  수 μžˆμŠ΅λ‹ˆλ‹€. Linear interpolation 필터링은 결과물을 λΆ€λ“œλŸ½κ²Œ λ§Œλ“€μ–΄ μ€λ‹ˆλ‹€.

FILTER_MODE_NEAREST

ν”½μ…€ 쀑심에 κ°€μž₯ κ°€κΉŒμš΄ μ’Œν‘œμ˜ 텍셀(texel)이 μ‚¬μš©λ©λ‹ˆλ‹€.

FILTER_MODE_LINEAR

ν”½μ…€μ˜ 쀑심에 κ°€μž₯ κ°€κΉŒμ΄μ— μžˆλŠ” ν…μ…€μ˜ 2x2 λ°°μ—΄μ˜ 가쀑 μ„ ν˜• 평균(weighted linear average)을 μ‚¬μš©ν•©λ‹ˆλ‹€.

FILTER_MODE_NEAREST_MIPMAP_NEAREST

κ°œλ³„ λ°‰λ§΅(mipmap) λ‚΄μ—μ„œ κ°€μž₯ κ°€κΉŒμš΄ 텍셀 값을 μ„ νƒν•©λ‹ˆλ‹€.

FILTER_MODE_NEAREST_MIPMAP_LINEAR

κ°€μž₯ κ°€κΉŒμš΄ λ°‰λ§΅ 두 κ°œμ—μ„œ κ°€μž₯ κ°€κΉŒμš΄ 텍셀(nearest texel)을 μ„ νƒν•˜μ—¬ 이 두 κ°’ 사이λ₯Ό μ„ ν˜•μ μœΌλ‘œ λ³΄κ°„ν•©λ‹ˆλ‹€.

FILTER_MODE_LINEAR_MIPMAP_NEAREST

κ°œλ³„ λ°‰λ§΅ λ‚΄μ—μ„œ μ„ ν˜•μ μœΌλ‘œ λ³΄κ°„ν•©λ‹ˆλ‹€.

FILTER_MODE_LINEAR_MIPMAP_LINEAR

μ„ ν˜• 보간을 μ‚¬μš©ν•˜μ—¬ 두 맡을 각각 κ³„μ‚°ν•˜κ³  이 두 κ°’ 사이λ₯Ό μ„ ν˜•μ μœΌλ‘œ λ³΄κ°„ν•©λ‹ˆλ‹€.

Vertex shader attributes

νŠΉμ„±(attribute)은 κ°œλ³„ λ²„ν…μŠ€μ™€ κ΄€λ ¨λœ κ°’μž…λ‹ˆλ‹€. 각기 λ‹€λ₯Έ μ»΄ν¬λ„ŒνŠΈ νƒ€μž…μ€ 각기 λ‹€λ₯Έ νŠΉμ„± λͺ¨μŒμ„ κ°€μ§€κ³  μžˆμŠ΅λ‹ˆλ‹€. 이 νŠΉμ„±μ— μ—‘μ„ΈμŠ€ ν•˜κΈ° μœ„ν•΄μ„œλŠ” 쉐이더 ν”„λ‘œκ·Έλž¨μ—μ„œ μ„ μ–Έν•˜κΈ°λ§Œ ν•˜λ©΄ λ©λ‹ˆλ‹€.

// 이 λ²„ν…μŠ€λ₯Ό μœ„ν•œ ν¬μ§€μ…˜κ³Ό ν…μŠ€μ³ μ’Œν‘œ
attribute mediump vec4 position;
attribute mediump vec2 texcoord0;
...

μ‚¬μš© κ°€λŠ₯ν•œ νŠΉμ„±μ€ μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

Sprite

position, texcoord0

Tilegrid

position, texcoord0

Spine model

position, texcoord0

GUI node

position, textcoord0, color

ParticleFX

position, texcoord0, color

Mesh

position, texcoord0, normal

Font

position, texcoord0, face_color, outline_color, shadow_color