From e0f2d0ccb23eb6b75d953dbf347cd857c3a857ce Mon Sep 17 00:00:00 2001 From: Alex Radchenko Date: Wed, 15 Nov 2023 11:18:50 +0200 Subject: [PATCH] Rt Normals example --- .defignore | 3 ++ .gitignore | 2 ++ assets/materials/normals.fp | 13 +++++++ assets/materials/normals.material | 22 ++++++++++++ assets/materials/use_normals.fp | 13 +++++++ assets/materials/use_normals.material | 50 +++++++++++++++++++++++++++ assets/models/cube.model | 2 +- assets/models/quad.model | 2 +- assets/models/sphere.model | 2 +- main/main.render | 4 +++ main/main.render_script | 29 ++++++++++++++++ main/main.script | 19 ---------- 12 files changed, 139 insertions(+), 22 deletions(-) create mode 100644 .defignore create mode 100644 assets/materials/normals.fp create mode 100644 assets/materials/normals.material create mode 100644 assets/materials/use_normals.fp create mode 100644 assets/materials/use_normals.material diff --git a/.defignore b/.defignore new file mode 100644 index 0000000..ddb2086 --- /dev/null +++ b/.defignore @@ -0,0 +1,3 @@ +/.defold/api +/.idea +/.vscode \ No newline at end of file diff --git a/.gitignore b/.gitignore index 14f5419..e11ff1a 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,5 @@ Thumbs.db .project .cproject builtins + +/.defold/api \ No newline at end of file diff --git a/assets/materials/normals.fp b/assets/materials/normals.fp new file mode 100644 index 0000000..8fb2093 --- /dev/null +++ b/assets/materials/normals.fp @@ -0,0 +1,13 @@ +varying highp vec4 var_position; +varying mediump vec3 var_normal; +varying mediump vec2 var_texcoord0; +varying mediump vec4 var_light; + +uniform lowp sampler2D tex0; +uniform lowp vec4 tint; + +void main() +{ + gl_FragColor = vec4(var_normal.xyz, 1.0); +} + diff --git a/assets/materials/normals.material b/assets/materials/normals.material new file mode 100644 index 0000000..a8c0fa7 --- /dev/null +++ b/assets/materials/normals.material @@ -0,0 +1,22 @@ +name: "model" +tags: "model" +vertex_program: "/builtins/materials/model.vp" +fragment_program: "/assets/materials/normals.fp" +vertex_space: VERTEX_SPACE_LOCAL +vertex_constants { + name: "mtx_worldview" + type: CONSTANT_TYPE_WORLDVIEW +} +vertex_constants { + name: "mtx_view" + type: CONSTANT_TYPE_VIEW +} +vertex_constants { + name: "mtx_proj" + type: CONSTANT_TYPE_PROJECTION +} +vertex_constants { + name: "mtx_normal" + type: CONSTANT_TYPE_NORMAL +} +max_page_count: 0 diff --git a/assets/materials/use_normals.fp b/assets/materials/use_normals.fp new file mode 100644 index 0000000..2cfb469 --- /dev/null +++ b/assets/materials/use_normals.fp @@ -0,0 +1,13 @@ +varying mediump vec2 var_texcoord0; + + +uniform lowp sampler2D tex0; +uniform lowp vec4 uResolution; + +void main() +{ + vec2 uv = gl_FragCoord.xy/uResolution.xy; + vec4 normal_tex = texture2D(tex0, uv); + gl_FragColor = vec4(normal_tex.xyz, 1.0); +} + diff --git a/assets/materials/use_normals.material b/assets/materials/use_normals.material new file mode 100644 index 0000000..2cd97bd --- /dev/null +++ b/assets/materials/use_normals.material @@ -0,0 +1,50 @@ +name: "model" +tags: "model" +vertex_program: "/builtins/materials/model.vp" +fragment_program: "/assets/materials/use_normals.fp" +vertex_space: VERTEX_SPACE_LOCAL +vertex_constants { + name: "mtx_worldview" + type: CONSTANT_TYPE_WORLDVIEW +} +vertex_constants { + name: "mtx_view" + type: CONSTANT_TYPE_VIEW +} +vertex_constants { + name: "mtx_proj" + type: CONSTANT_TYPE_PROJECTION +} +vertex_constants { + name: "mtx_normal" + type: CONSTANT_TYPE_NORMAL +} +vertex_constants { + name: "light" + type: CONSTANT_TYPE_USER + value { + x: 1.0 + y: 1.0 + z: 1.0 + w: 1.0 + } +} +fragment_constants { + name: "tint" + type: CONSTANT_TYPE_USER + value { + x: 1.0 + y: 1.0 + z: 1.0 + w: 1.0 + } +} +samplers { + name: "tex0" + wrap_u: WRAP_MODE_CLAMP_TO_EDGE + wrap_v: WRAP_MODE_CLAMP_TO_EDGE + filter_min: FILTER_MODE_MIN_LINEAR + filter_mag: FILTER_MODE_MAG_LINEAR + max_anisotropy: 1.0 +} +max_page_count: 0 diff --git a/assets/models/cube.model b/assets/models/cube.model index eca7a0d..1a67f04 100644 --- a/assets/models/cube.model +++ b/assets/models/cube.model @@ -1,5 +1,5 @@ mesh: "/builtins/assets/meshes/cube.dae" -material: "/builtins/materials/model.material" +material: "/assets/materials/use_normals.material" textures: "/assets/images/green.png" skeleton: "" animations: "" diff --git a/assets/models/quad.model b/assets/models/quad.model index b9effb9..6537646 100644 --- a/assets/models/quad.model +++ b/assets/models/quad.model @@ -1,5 +1,5 @@ mesh: "/builtins/assets/meshes/quad.dae" -material: "/builtins/materials/model.material" +material: "/assets/materials/use_normals.material" textures: "/assets/images/brown.png" skeleton: "" animations: "" diff --git a/assets/models/sphere.model b/assets/models/sphere.model index 09d2aaa..c0df2b9 100644 --- a/assets/models/sphere.model +++ b/assets/models/sphere.model @@ -1,5 +1,5 @@ mesh: "/builtins/assets/meshes/sphere.dae" -material: "/builtins/materials/model.material" +material: "/assets/materials/use_normals.material" textures: "/assets/images/brown.png" skeleton: "" animations: "" diff --git a/main/main.render b/main/main.render index 34089b1..6c2e65b 100644 --- a/main/main.render +++ b/main/main.render @@ -1 +1,5 @@ script: "/main/main.render_script" +materials { + name: "rt_normals" + material: "/assets/materials/normals.material" +} diff --git a/main/main.render_script b/main/main.render_script index 2c62f70..b2c7c84 100644 --- a/main/main.render_script +++ b/main/main.render_script @@ -53,6 +53,20 @@ function init(self) self.near = -1 self.far = 1 self.projection_fn = stretch_projection + + self.rt_normals = render.render_target("rt_normals",{ + [render.BUFFER_COLOR_BIT] = { + format = render.FORMAT_RGB, + width = render.get_window_width(), + height = render.get_window_height(), + min_filter = render.FILTER_LINEAR, + mag_filter = render.FILTER_LINEAR, + u_wrap = render.WRAP_CLAMP_TO_EDGE, + v_wrap = render.WRAP_CLAMP_TO_EDGE + } + }) + + self.constants_buffer = render.constant_buffer() end function update(self) @@ -64,13 +78,28 @@ function update(self) render.set_view(self.view) render.set_projection(get_projection(self)) + self.constants_buffer.uResolution = vmath.vector4(render.get_window_width(), render.get_window_height(), 0, 0) + -- render models -- render.set_blend_func(render.BLEND_SRC_ALPHA, render.BLEND_ONE_MINUS_SRC_ALPHA) render.enable_state(render.STATE_CULL_FACE) render.enable_state(render.STATE_DEPTH_TEST) render.set_depth_mask(true) + + render.set_render_target(self.rt_normals) + + -- Set material that process draws Normals to RT + render.enable_material("rt_normals") render.draw(self.model_pred) + render.disable_material() + + render.set_render_target(render.RENDER_TARGET_DEFAULT) + + render.enable_texture(0, self.rt_normals, render.BUFFER_COLOR_BIT) + render.draw(self.model_pred, { constants = self.constants_buffer } ) + + render.set_depth_mask(false) render.disable_state(render.STATE_DEPTH_TEST) render.disable_state(render.STATE_CULL_FACE) diff --git a/main/main.script b/main/main.script index b95dc93..52e880c 100644 --- a/main/main.script +++ b/main/main.script @@ -7,23 +7,4 @@ function init(self) go.animate(".", "euler.z", go.PLAYBACK_LOOP_FORWARD, 360, go.EASING_INOUTQUAD, 6) go.animate(".", "euler.x", go.PLAYBACK_LOOP_FORWARD, 360, go.EASING_INOUTQUAD, 9) go.animate(".", "euler.y", go.PLAYBACK_LOOP_FORWARD, 360, go.EASING_INOUTQUAD, 12) - - -- tint the cube and the sphere - go.set("#cube", "tint", vmath.vector4(1,1,0,1)) - go.set("#sphere", "tint", vmath.vector4(1,0,0,1)) - - -- position directional light - self.light = vmath.vector4(0, 0, go.get_position().z + 1, 0) - go.set("#cube", "light", self.light) - go.set("#quad", "light", self.light) - go.set("#sphere", "light", self.light) -end - -function on_input(self, action_id, action) - -- move directional light based on input - self.light.x = 2 * ((action.x - 480) / 480) - self.light.y = 2 * ((action.y - 320) / 320) - go.set("#cube", "light", self.light) - go.set("#quad", "light", self.light) - go.set("#sphere", "light", self.light) end \ No newline at end of file