Rendering - kuimoani/defold GitHub Wiki
Rendering
์์ง์ ์ํด ํ๋ฉด์ ๋ํ๋๋ ๋ชจ๋ ์ค๋ธ์ ํธ(sprites, models, tiles, particles, GUI nodes)๋ ๋ ๋๋ง ํ์ดํ๋ผ์ธ์ ์ํด ๊ทธ๋ ค์ง๋๋ค. ์ด ๋ฉ๋ด์ผ์ ํ์ดํ ๋ผ์ธ์ด ์ด๋ป๊ฒ ๋์ํ๋ฉฐ ์ด๊ฒ์ ์ด๋ป๊ฒ ํ๋ก๊ทธ๋๋ฐ ํ๋ฉด ๋๋์ง ์ค๋ช ํฉ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก Defold๋ ๋ชจ๋ 2D ์ค๋ธ์ ํธ๋ฅผ ํน์ ๋ธ๋ ๋ฉ๊ณผ ์ ๋นํ Z depth๋ก ์ ์ ํ๊ฒ ๋นํธ๋งต์ ๊ทธ๋ ค์ฃผ๋ฏ๋ก ์ ๋ ฌ(ordering)๊ณผ ๋ธ๋ ๋ฉ(blending) ์ด์์ ๋ ๋๋ง์ ๋ํ์ฌ ๊ณ ๋ฏผํ ํ์๊ฐ ์์ต๋๋ค. ์ด ํ์ดํ๋ผ์ธ์ ๋๋ถ๋ถ์ 2D ๊ฒ์์์ ์ ๋์ํ์ง๋ง, ๋ ๋ค๋ฅธ ํน๋ณํ ์๊ตฌ์ฌํญ์ด ์์ ์ ์์ต๋๋ค. Defold์์๋ ์ด๋ฐ ๊ฒฝ์ฐ์ ๋ง์ถคํ ๋ ๋๋ง ํ์ดํ๋ผ์ธ์ ์์ฑํ ์ ์์ต๋๋ค.
The default renderer
๋ ๋๋ง ํ์ดํ๋ผ์ธ์ ํต์ฌ์ ๋ ๋ ์คํฌ๋ฆฝํธ(render script)์ ๋๋ค. ์ด ํ์ผ์ init(), update(), on_message() ํจ์๋ฅผ ์ฌ์ฉํ๋ ๋ณดํต์ Lua ์คํฌ๋ฆฝํธ์ด๋ฉฐ OpenGL ๋ ๋๋ง API ์ ์ํตํ๋๋ฐ ์ฃผ๋ก ์ฌ์ฉ๋ฉ๋๋ค. ํ๋ก์ ํธ์ "Builtins" ํด๋ ์์์ ๊ธฐ๋ณธ ๋ ๋ ์ค๋ธ์ ํธ("default.render")์ ๊ธฐ๋ณธ ๋ ๋ ์คํฌ๋ฆฝํธ("default.render_script")๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค. ๋ ๋ ์ค๋ธ์ ํธ๋ ํ์ฌ์ ๋ ๋ ์คํฌ๋ฆฝํธ์ ๋ํ ์ฐธ์กฐ๋ฅผ ํฌํจํ๊ณ ์์ต๋๋ค.
Defold๋ ํด๋์ฅ์น์์ OpenGL ES 2.0 ๊ธฐ๋ฐ์ผ๋ก ๋ ๋๋ง ๋ฉ๋๋ค. ๋ฐ์คํฌํ์์๋ ๋ณดํต์ Open GL์ ์ฌ์ฉํ๋ฏ๋ก OpenGL ES 2.0์์ ์ง์ํ์ง ์๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ์์ด๋๋ฅผ ์์ฑํ๋ ๊ฒ์ด ๊ฐ๋ฅํ์ง๋ง ์ด๋ ๋ฐ์คํฌํ๊ณผ ํด๋์ฅ์น๊ฐ์ ์ํธ ํธํ์ ๊นจํธ๋ฆด ์ ์์ต๋๋ค.


์ปค์คํ ๋ ๋๋ฌ๋ฅผ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ์ต๋๋ค.
- "default.render" ํ์ผ๊ณผ "default.render_script" ํ์ผ์ ๋ณต์ฌํฉ๋๋ค.
- ๋ณต์ฌํ ํ์ผ๋ค์ ๋น์ ์ ํ๋ก์ ํธ์ ์๋ฌด๋ฐ๋ ("render" ํด๋ ๊ฐ์ ๊ณณ)์ ๋ถ์ฌ ๋ฃ๊ธฐ ํฉ๋๋ค.
- ๋ณต์ฌํ "default.render" ํ์ผ์ ์ฐ ํ (์ด๋ฆ ๋ฐ๊ฟ๋ ๋จ) script ์์ฑ์ ๋ณ๊ฒฝํ์ฌ ๋ณต์ฌํ ๋ ๋ ์คํฌ๋ฆฝํธ ํ์ผ์ ์ฐธ์กฐํฉ๋๋ค.
- "game.project" ์ค์ ํ์ผ์์ Bootstrap ํญ๋ชฉ ์๋์ render ์์ฑ์ ๋ณ๊ฒฝํ์ฌ ์์์ ๋ณต์ฌํ "default.render" ์ค๋ธ์ ํธ๋ฅผ ์ฐธ์กฐํฉ๋๋ค.
๋ฌผ๋ก ๊ทธ๋ฅ ์ฒ์๋ถํฐ ๋ ๋ ์คํฌ๋ฆฝํธ ํ์ผ์ ์๋ก ์์ฑํด๋ ๋์ง๋ง, Defold์ OpenGL ES ๋ ๋๋ง์ ์ฒ์ ๋ค๋ค๋ณด๋ ์ฌ์ฉ์๋ผ๋ฉด ๊ธฐ์กด ์คํฌ๋ฆฝํธ์์ ๋ณต์ฌํด์ ํธ์งํ๋ ๋ฐฉ์์ด ์ข์ ์ ๊ทผ๋ฒ์ ๋๋ค.
๋ ๋ ์คํฌ๋ฆฝํธ๋ ๊ฒ์์ ๋ผ์ดํ์ฌ์ดํด ๋ด์์ ํน๋ณํ ์์น์ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ Application lifecycle ๋ฌธ์์์ ์ฐพ์ ์ ์์ต๋๋ค.
Render predicates
render predicates(๋ ๋ ์ ์ด or ์กฐ๊ฑด์)๋ ์ค๋ธ์ ํธ์ ๊ทธ๋ฆฌ๊ธฐ ์์(draw order)๋ฅผ ์ ์ดํ ์ ์์ต๋๋ค. predicate๋ ๋ฉํฐ๋ฆฌ์ผ ํ๊ทธ์ ์ ํ์ ๊ธฐ๋ฐ์ผ๋ก ๋ฌด์์ ๊ทธ๋ฆด ๊ฒ์ธ์ง ์ ์ธํฉ๋๋ค. ํ๋ฉด์ ๊ทธ๋ ค์ง๋ ๊ฐ ์ค๋ธ์ ํธ๋ ๋ฉํฐ๋ฆฌ์ผ์ ํฌํจํ๊ณ ์์ผ๋ฉฐ, ์ค๋ธ์ ํธ๋ฅผ ์ด๋ป๊ฒ ์ ํํ ํ๋ฉด์ ๊ทธ๋ฆด์ง, ์ด๋ค ์์ด๋ ํ๋ก๊ทธ๋จ์ ์คํํ ์ง๋ฅผ ์ ์ดํฉ๋๋ค. ๋ฉํฐ๋ฆฌ์ผ์์๋, ๋ฉํฐ๋ฆฌ์ผ๊ณผ ์ฐ๊ด๋ ํ ๊ฐ ์ด์์ ํ๊ทธ๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๊ฒ์์ ๋น๋ํ ๋ ๋นํธ ํ๋(bit field)๋ก ์ปดํ์ผ ๋์ง๋ง, ์๋ํฐ์์์๋ ๋ณดํต์ ํ ์คํธ ํ๊ทธ๋ก ๋ํ๋ฉ๋๋ค. ๋ ๋ ์คํฌ๋ฆฝํธ์์ ํ๋๊ฐ ๋ ๋ predicate๋ฅผ ๋ง๋ค๊ณ ์ด predicate๊ฐ ์ํ ํ๊ทธ๋ฅผ ์ง์ ํด ๋ณด์ธ์. ๋ง์ง๋ง์ผ๋ก predicate๋ฅผ ๊ทธ๋ฆด ๋์๋, predicate์ ์ง์ ๋ ๋ชฉ๋ก๊ณผ ์ผ์นํ๋ ํ๊ทธ๋ฅผ ํฌํจํ ๋ฉํฐ๋ฆฌ์ผ์ด ์๋ ๊ฐ ์ค๋ธ์ ํธ๊ฐ ๊ทธ๋ ค์ง๋๋ค. ๋ฉํฐ๋ฆฌ์ผ์ ๋ํ ๋ ์์ธํ ์ค๋ช ์ Material ๋ฌธ์์์ ์ฐพ์ ์ ์์ต๋๋ค.

The render script
๋ ๋ ์คํฌ๋ฆฝํธ๊ฐ ์ด๋ป๊ฒ ๋์ํ๋์ง ๋ ์ดํดํ๊ธฐ ์ํด์ ๊ธฐ๋ณธ ๋ด์ฅ๋ ์คํฌ๋ฆฝํธ๋ฅผ ์กฐ๊ธ ์์ ํ ๋ฒ์ ์ผ๋ก ์์ธํ ์ดํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. init() ์ด ์์๋๋ฉด predicate, view, clear color๋ฅผ ์ค์ ํ๋๋ฐ, ์ด ๋ณ์๋ค์ ์ค์ ๋ ๋๋ง ์ค์ ์ฌ์ฉ๋ฉ๋๋ค.
init()
function init(self)
-- render predicate๋ฅผ ์ ์ํฉ๋๋ค. ๊ฐ predicate๋ ์๊ธฐ ์ค์ค๋ก ๋๋ก์ฐ๋๊ณ ์ด ๋๋ก์ฐ๋ค ์ฌ์ด์์ OpenGL์ ์ํ๋ฅผ ๋ณ๊ฒฝ ํ ์ ์์ต๋๋ค.
self.tile_pred = render.predicate({"tile"})
self.gui_pred = render.predicate({"gui"})
self.text_pred = render.predicate({"text"})
self.particle_pred = render.predicate({"particle"})
self.model_pred = render.predicate({"model"})
self.clear_color = vmath.vector4(0, 0, 0, 0)
self.clear_color.x = sys.get_config("render.clear_color_red", 0)
self.clear_color.y = sys.get_config("render.clear_color_green", 0)
self.clear_color.z = sys.get_config("render.clear_color_blue", 0)
self.clear_color.w = sys.get_config("render.clear_color_alpha", 0)
-- ์ฌ์ฉํ view matrix๋ฅผ ์ ์ํฉ๋๋ค. ์นด๋ฉ๋ผ ์ค๋ธ์ ํธ๋ฅผ ์ฌ์ฉํ๋ค๋ฉด "set_view_projection" ๋ฉ์ธ์ง๋ฅผ ๋ ๋ ์คํฌ๋ฆฝํธ๋ก ์ ์กํ๊ณ ์นด๋ฉ๋ผ๊ฐ ์ ๊ณตํ๋ ๊ฐ์ผ๋ก view matrix๋ฅผ ์
๋ฐ์ดํธ ํ ์ ์์ต๋๋ค.
self.view = vmath.matrix4()
end
์ปค์คํ ํ ํ๋ก์ ํธ ์ ํ ์ ์ด๋ป๊ฒ ์ ์ํ๊ณ ์ฌ์ฉํ ์ง์ ๋ํ ์ ๋ณด๋ Project settings ๋ฌธ์์์ ์ฐพ์ ์ ์์ต๋๋ค. ๊ฒ์ ์นด๋ฉ๋ผ๊ฐ ๋์ํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์๊ณ ์ถ๋ค๋ฉด Camera ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์ธ์.
update()
update() ํจ์๋ ๋งค ํ๋ ์ ๋ง๋ค ํธ์ถ๋ฉ๋๋ค. ์ด ํจ์๋ OpenGL ES API(OpenGL Embedded Systems API)๋ฅผ ์ฌ์ฉํ์ฌ ์ค์ ๋๋ก์์ ์ฒ๋ฆฌํฉ๋๋ค. update() ํจ์์์ ๋ฌด์จ์ผ์ด ๋ฒ์ด์ง๋์ง ์ดํดํ๊ธฐ ์ํด์๋ OpenGL์ด ๋์ํ๋ ๋ฐฉ๋ฒ์ ์ดํดํด์ผ๋ง ํฉ๋๋ค. OpenGL ES์๋ ํ๋ฅญํ ๋ฆฌ์์ค๊ฐ ๋ง์ด ์์ผ๋ฉฐ https://www.khronos.org/opengles/ ๊ณต์ ์ฌ์ดํธ๊ฐ ์ดํด๋ฅผ ์ํ ์ข์ ์ถ๋ฐ์ ์ด ๋ ์ ์์ต๋๋ค.
๋ค์ ์์ ์๋ 3D ๋ชจ๋ธ์ ์ฌ๋ฐ๋ฅด๊ฒ ๊ทธ๋ฆฌ๋๋ฐ ํ์ํ ์ค์ ์ ํ๋ ๋ด์ฅ ์คํฌ๋ฆฝํธ์ ๋ํ ์ฃผ์์ฌํญ์ด ํฌํจ๋์ด ์์ต๋๋ค. ์์์ ๋ณด์๋ฏ์ด, self.model_pred predicate๊ฐ ๊ตฌ์ฑ๋๊ณ ๋ค๋ฅธ ๊ณณ์์ ์ด predicate์ ํด๋นํ๋ ๋ฉํฐ๋ฆฌ์ผ์ด ์ ์๋์ด 3D ๋ชจ๋ธ ์ปดํฌ๋ํธ์ ๋ฐ์๋์์ต๋๋ค. update() ์ฝ๋๋ ์ด predicate์ ๋ํ ํน์ ํ ์ฒ๋ฆฌ๋ฅผ ํ์๋ก ํฉ๋๋ค.
function update(self)
-- depth buffer๋ฅผ ์์ ํ ์ ์๋๋ก depth mask๋ฅผ ์ค์ ํจ
render.set_depth_mask(true)
-- ํด๋ฆฌ์ด ์ปฌ๋ฌ๊ฐ(clear color)์ผ๋ก color buffer๋ฅผ ์ง์ฐ๊ณ depth buffer๋ฅผ 1.0์ผ๋ก ์ค์ ํจ
-- ์ ์์ ์ธ depth ๊ฐ์ 0.0(near)์์ 1.0(far) ์ฌ์ด์ด๋ฏ๋ก ๋ฒํผ์์ ๊ฐ๋ค์ ์ต๋ํ(maximizing)ํ๋ฉด ๊ทธ๋ ค์ง ๋ชจ๋ ํฝ์
์ด 1.0๋ณด๋ค ๊ฐ๊น์์ง๊ธฐ ๋๋ฌธ์ ์ฌ๋ฐ๋ฅด๊ฒ ๊ทธ๋ ค์ง๊ฒ ๋๋ฉฐ ๊น์ด ํ
์คํธ(depth testing)๊ฐ ์ํ๋จ
render.clear({[render.BUFFER_COLOR_BIT] = self.clear_color, [render.BUFFER_DEPTH_BIT] = 1, [render.BUFFER_STENCIL_BIT] = 0})
-- ๋ทฐํฌํธ๋ฅผ ์๋์ฐ์ ์ฐฝ ํฌ๊ธฐ๋ก ์ค์ ํจ
render.set_viewport(0, 0, render.get_window_width(), render.get_window_height())
-- ๋ทฐ๋ฅผ ์ ์ฅํ ๋ทฐ ๊ฐ์ผ๋ก ์ค์ ํจ(์นด๋ฉ๋ผ ์ค๋ธ์ ํธ๋ฅผ ์ด์ฉํด ์ค์ ๊ฐ๋ฅ)
render.set_view(self.view)
-- 2D ๊ณต๊ฐ ๋ ๋๋งํ๊ธฐ
render.set_depth_mask(false)
render.disable_state(render.STATE_DEPTH_TEST)
render.disable_state(render.STATE_STENCIL_TEST)
render.enable_state(render.STATE_BLEND)
render.set_blend_func(render.BLEND_SRC_ALPHA, render.BLEND_ONE_MINUS_SRC_ALPHA)
render.disable_state(render.STATE_CULL_FACE)
-- ์ง๊ต(orthographic) ์ํ๋ก ํฌ์(projection)๋ฐฉ์์ ์ค์ ํ์ฌ -200์์ 200 Z-depth ์ฌ์ด๊น์ง๋ง ๋ ๋๋งํจ
render.set_projection(vmath.matrix4_orthographic(0, render.get_width(), 0, render.get_height(), -200, 200))
render.draw(self.tile_pred)
render.draw(self.particle_pred)
-- 3D ๊ณต๊ฐ ๋ ๋๋งํ๊ธฐ, ํ์ง๋ง ์ฌ์ ํ ์ง๊ต(orthographic) ์ํ์
-- ํ์ด์ค ์ปฌ๋ง(Face culling)๊ณผ ๊น์ด ํ
์คํธ(depth test)๋ฅผ ํ์ฑํ ํจ
render.enable_state(render.STATE_CULL_FACE)
render.enable_state(render.STATE_DEPTH_TEST)
render.set_depth_mask(true)
render.draw(self.model_pred)
render.draw_debug3d()
-- ๋ง์ง๋ง์ผ๋ก GUI ๋ ๋๋งํ๊ธฐ
render.set_view(vmath.matrix4())
render.set_projection(vmath.matrix4_orthographic(0, render.get_window_width(), 0, render.get_window_height(), -1, 1))
render.enable_state(render.STATE_STENCIL_TEST)
render.draw(self.gui_pred)
render.draw(self.text_pred)
render.disable_state(render.STATE_STENCIL_TEST)
render.set_depth_mask(false)
render.draw_debug2d()
end
์, ์ด์ ๋จ์ํ๊ณ ์ง๊ด์ ์ธ ๋ ๋ ์คํฌ๋ฆฝํธ๊ฐ ์์ฑ๋์์ต๋๋ค. ์ด ๋ ๋ ์คํฌ๋ฆฝํธ๋ ๋งค ํ๋ ์๋ง๋ค ๋์ผํ ๋ฐฉ์์ผ๋ก ํ๋ฉด์ ๊ทธ๋ฆฌ์ง๋ง, ๋ง์ฝ ๋ ๋ ์ํ(render states)๋ฅผ ๋์ ํ์ฌ ๋ค๋ฅธ ๊ณณ์์ ๋ ๋๋ง ํ์ดํ๋ผ์ธ(render pipeline)์ ์ ์ดํ๋ ค๊ณ ํ๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น์?
on_message()
์ด ๋ ๋ ์คํฌ๋ฆฝํธ ๋ํ Defold์ ๋ฉ์ธ์ง ์ ๋ฌ ์ธ์์์๋ ๋ณดํต์ ์๋ฏผ๋ค๊ณผ ๋ค๋ฅผ ๋ฐ ์์ต๋๋ค. ๊ทธ๋ฅ ๋ ๋ ์คํฌ๋ฆฝํธ์ on_message() ํจ์๋ฅผ ์ ์ํ๋ ๊ฒ์ผ๋ก ๊ฒ์์ ๋ค๋ฅธ ํํธ์์ ๋ ๋ ์คํฌ๋ฆฝํธ์ ๋์์ ์ํฅ์ ์ฃผ๋๋ก ํ๋ฉด ๋ฉ๋๋ค. ๋ ๋ ์คํฌ๋ฆฝํธ์ ์ ๋ณด๋ฅผ ๋ณด๋ด๋ ์ธ๋ถ ์ค๋ธ์ ํธ์ ๋ํ ์์ ๋ก๋ ์นด๋ฉ๋ผ ์ปดํฌ๋ํธ๊ฐ ์์ต๋๋ค(์์ธํ ๋ด์ฉ์ Camera ๋ฌธ์ ์ฐธ๊ณ ). ์นด๋ฉ๋ผ ํฌ์ปค์ค๊ฐ ์๋ ์นด๋ฉ๋ผ ์ปดํฌ๋ํธ๋ ์๋์ ์ผ๋ก ๋ ๋ ์คํฌ๋ฆฝํธ์ view์ projection์ ๋ณด๋ด๊ณ ์์ต๋๋ค. ๋ฐ๋ฉด ์ผ๋ฐ ์คํฌ๋ฆฝํธ์์ ๋ ๋ ์คํฌ๋ฆฝํธ์ ํต์ ํ๋ ค๋ฉด ํน์ํ ์์ผ์ธ @render๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
function on_message(self, message_id, message)
if message_id == hash("clear_color") then
-- ์ด๋์ ๊ฐ ํด๋ฆฌ์ด ์ปฌ๋ฌ(clear color) ๋ฉ์ธ์ง๋ฅผ ๋ณด๋
self.clear_color = message.color
elseif message_id == hash("set_view_projection") then
-- ์นด๋ฉ๋ผ ํฌ์ปค์ค๋ฅผ ๊ฐ์ง ์นด๋ฉ๋ผ ์ปดํฌ๋ํธ๊ฐ @render ์์ผ์ผ๋ก set_view_projection ๋ฉ์ธ์ง๋ฅผ ๋ณด๋. ๋ ๋๋ง์ view(๊ทธ๋ฆฌ๊ณ ์ฌ์ฉ๊ฐ๋ฅํ projection)๋ฅผ ์ค์ ํ๊ธฐ ์ํ ์นด๋ฉ๋ผ ์ ๋ณด๋ฅผ ์ฌ์ฉํ ์ ์์
-- ํ์ฌ, ์ง๊ต ์ํ๋ก(orthogonally) ๋ ๋๋ง ์ค์ด๋ฏ๋ก ์นด๋ฉ๋ผ ํฌ์(projection)์ด ํ์ ์์
self.view = message.view
end
end
์์ ๋ ๋ ์คํฌ๋ฆฝํธ์ on_message() ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด, ์๋์ฒ๋ผ ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ด์ clear color๋ฅผ ๋ฉ์ง ๋คํฌ ์คํธ ๋ธ๋ฃจ(dark steel blue) ์๊น๋ก ๋ฐ๊ฟ ์ ์์ต๋๋ค.
msg.post("@render:", "clear_color", { color = vmath.vector4(0.3, 0.4, 0.5, 0) })
System messages
@render ์์ผ์ ๋ช ๊ฐ์ง ๋ด์ฅ ๋ฉ์ธ์ง๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ฐ์ , ์๋์ฐ ์ฌ์ด์ฆ๊ฐ ๋ณ๊ฒฝ๋์์ ๊ฒฝ์ฐ ์์ง์ด ๋ณด๋ด์ฃผ๋ window_resized ๋ฉ์ธ์ง๊ฐ ์์ต๋๋ค. ๋ฐ์คํฌํ์์๋ ๊ฒ์ ์ฐฝ ํฌ๊ธฐ๊ฐ ์กฐ์ ๋ ๊ฒฝ์ฐ, ๋ชจ๋ฐ์ผ์์๋ orientation์ด ๋ฐ๋ ๊ฒฝ์ฐ ์ด ๋ฉ์ธ์ง๊ฐ ์ ๋ฌ๋ฉ๋๋ค.
function on_message(self, message_id, message)
if message_id == hash("window_resized") then
-- ์๋์ฐ๊ฐ ๋ฆฌ์ฌ์ด์ง ๋จ. ์ ํฌ๊ธฐ๊ฐ message.width์ message.height์ ํฌํจ๋จ
...
end
end
๋ํ ํ ์คํธ์ ์ ์ ๊ทธ๋ฆด ์ ์๋ ๋ฉ์ธ์ง๋ ์์ต๋๋ค.
-- (1000, 1000)์ขํ๊น์ง ํฐ์ ์ ์ ๊ทธ๋ฆผ
msg.post("@render:", "draw_line", { start_point = vmath.vector3(0, 0, 0), end_point = vmath.vector3(1000, 1000, 0), color = vmath.vector4(1, 1, 1, 1) } )
-- 500, 500 ์ขํ์ ํ
์คํธ ๋ฉ์ธ์ง๋ฅผ ๊ทธ๋ฆผ
msg.post("@render:", "draw_text", { text = "Hello world!", position = vmath.vector3(500, 500, 0) } )
์ด ๋ฉ์ธ์ง๋ค์ ๋๋ฒ๊น ์ ๋ณด๋ฅผ ๊ทธ๋ฆฌ๊ธฐ ์ํด ๋ง๋ค์ด์ก์ต๋๋ค. ๋๋ฒ๊ทธ ๋ฉ์ธ์ง๋ฅผ ์ถ๋ ฅํ๊ฑฐ๋ ray_casts๋ vector๋ ํ๋ก๊ทธ๋๋ฐ์ ์ํ ๊ฐ๋ฐ ํต๊ณ ๋ฐ์๋ฅผ ์ฝ๊ฒ ์๊ฐํ ํ๋๋ฐ ์ ์ฉํ๋ฉฐ, ์๋์ ์ค๋ช ์ฒ๋ผ ๋ ๋ ์คํฌ๋ฆฝํธ์ ๊ด๋ จ์ด ์์ต๋๋ค.
-
draw_line ๋ฉ์ธ์ง๋ฅผ ํตํด ์ฌ(scene)์ ์ถ๊ฐ๋ ๋ชจ๋ ์ (line)๋ค์ render.draw_debug3d() ํธ์ถ์ ์ํด ๊ทธ๋ ค์ง๋๋ค.
-
draw_text ๋ฉ์ธ์ง๋ฅผ ํตํด ์ฌ(scene)์ ์ถ๊ฐ๋ ๋ชจ๋ ํ ์คํธ(text)๋ค์ ๋ด์ฅ๋ "system_font"๋ก ๊ทธ๋ ค์ง๋๋ค. ์์คํ ํฐํธ๋ "text" ํ๊ทธ๊ฐ ์๋ ๋ฉํฐ๋ฆฌ์ผ์ ๊ฐ์ง๋ฏ๋ก ์์ ๋ ๋ ์คํฌ๋ฆฝํธ ๋ด์ฉ์ค์์ "self.text_pred" predicate์ ๊ทธ๋ ค์ง๋๋ค.
toggle_profile ๋ฉ์ธ์ง๋ฅผ @system ์์ผ์ผ๋ก ๋ณด๋ด์ ์ ๊ทผ ํ ์ ์๋ ๋น์ฃผ์ผ ํ๋กํ์ผ๋ฌ(visual profiler)๋ ์คํฌ๋ฆฝํธ๋ก ์ฒ๋ฆฌ ๊ฐ๋ฅํ ๋ ๋๋ฌ์๋ ๋ค๋ฅธ ํํธ์ด๋ฏ๋ก ๋น์ ์ ๋ ๋ ์คํฌ๋ฆฝํธ์๋ ๋ถ๋ฆฌ๋์ด ๊ทธ๋ ค์ง๋๋ค.