From 53c357694654951af4c9e7166b6c5b00e7470f54 Mon Sep 17 00:00:00 2001 From: harrand Date: Tue, 4 Jul 2023 03:04:45 +0100 Subject: [PATCH] + Added normal information to tz_mesh_demo. We now display the final computed normal instead of the colour, because I'm missing basic lighting. Working on that next tho. --- demo/gl/tz_mesh_demo/main.cpp | 21 ++++++++++++++++--- demo/gl/tz_mesh_demo/mesh.hpp | 1 + demo/gl/tz_mesh_demo/mesh_renderer.cpp | 12 +++++++---- demo/gl/tz_mesh_demo/mesh_renderer.hpp | 4 ++-- .../tz_mesh_demo/shaders/mesh3d.fragment.tzsl | 20 ++++++++++++++---- .../tz_mesh_demo/shaders/mesh3d.vertex.tzsl | 4 +++- 6 files changed, 48 insertions(+), 14 deletions(-) diff --git a/demo/gl/tz_mesh_demo/main.cpp b/demo/gl/tz_mesh_demo/main.cpp index 920ac94ad3..874896066a 100644 --- a/demo/gl/tz_mesh_demo/main.cpp +++ b/demo/gl/tz_mesh_demo/main.cpp @@ -36,7 +36,7 @@ int main() scene_t scene = temp_debug_load_cube_gltf(); std::vector scene_meshes(scene.meshes.size()); std::vector scene_images(scene.images.size()); - std::vector mesh_bound_images(scene.meshes.size()); + std::vector> mesh_bound_images(scene.meshes.size()); mesh_renderer renderer{scene.images.size()}; renderer.push_back_timeline(); @@ -46,11 +46,16 @@ int main() std::string mname = "GLTF Mesh" + std::to_string(i); scene_meshes[i] = renderer.add_mesh(scene.meshes[i], mname.c_str()); std::size_t iid = 0; + std::size_t nid = 0; if(scene.meshes[i].image_id != static_cast(-1)) { iid = scene.meshes[i].image_id; } - mesh_bound_images[i] = iid; + if(scene.meshes[i].norm_image_id != static_cast(-1)) + { + nid = scene.meshes[i].norm_image_id; + } + mesh_bound_images[i] = {iid, nid}; } for(std::size_t i = 0; i < scene.images.size(); i++) { @@ -60,7 +65,12 @@ int main() } for(std::size_t i = 0; i < scene.meshes.size(); i++) { - renderer.add_to_draw_list(scene_meshes[i], {.scale = {0.01f, 0.01f, 0.01f}}, scene_images[mesh_bound_images[i]]); + std::vector real_image_ids; + for(std::size_t id : mesh_bound_images[i]) + { + real_image_ids.push_back(scene_images[id]); + } + renderer.add_to_draw_list(scene_meshes[i], {.scale = {0.01f, 0.01f, 0.01f}}, real_image_ids); } tz::duration update_timer = tz::system_time(); @@ -191,6 +201,11 @@ scene_t temp_debug_load_cube_gltf() cur.image_id = tex.image_id; tz::assert(tex.texcoord_id == 0, "use of multiple texcoords is NYI. GLTF wants to use texcoord %zu for colour", tex.texcoord_id); } + else if(tex.type == tz::io::gltf_submesh_texture_type::normal) + { + cur.norm_image_id = tex.image_id; + tz::assert(tex.texcoord_id == 0, "use of multiple texcoords is NYI. GLTF wants to use texcoord %zu for colour", tex.texcoord_id); + } } } } diff --git a/demo/gl/tz_mesh_demo/mesh.hpp b/demo/gl/tz_mesh_demo/mesh.hpp index 63e4e28bbf..906e20d8ad 100644 --- a/demo/gl/tz_mesh_demo/mesh.hpp +++ b/demo/gl/tz_mesh_demo/mesh.hpp @@ -18,4 +18,5 @@ struct mesh_t std::vector vertices = {}; std::vector indices = {}; std::size_t image_id = -1; + std::size_t norm_image_id = -1; }; diff --git a/demo/gl/tz_mesh_demo/mesh_renderer.cpp b/demo/gl/tz_mesh_demo/mesh_renderer.cpp index 30388207a5..95f8334f79 100644 --- a/demo/gl/tz_mesh_demo/mesh_renderer.cpp +++ b/demo/gl/tz_mesh_demo/mesh_renderer.cpp @@ -118,7 +118,7 @@ void mesh_renderer::push_back_timeline() const tz::gl::get_device().render_graph().add_dependencies(this->rh, this->ch); } -void mesh_renderer::add_to_draw_list(meshid_t mesh, transform_t transform, texid_t tex) +void mesh_renderer::add_to_draw_list(meshid_t mesh, transform_t transform, std::vector tex) { this->append_meshid_to_draw_buffer(mesh, transform, tex); this->draw_list.push_back(mesh); @@ -189,7 +189,7 @@ void mesh_renderer::dbgui() ImGui::SliderInt("Texture", &create_texid, 0, this->textures.size()); if(ImGui::Button("Create")) { - this->add_to_draw_list(create_meshid, {}, create_texid); + this->add_to_draw_list(create_meshid, {}, {static_cast(create_texid), 0u}); } ImGui::EndTabItem(); } @@ -349,13 +349,17 @@ void mesh_renderer::append_mesh_to_buffers(const mesh_t& mesh) ); } -void mesh_renderer::append_meshid_to_draw_buffer(meshid_t mesh, transform_t transform, texid_t tex) +void mesh_renderer::append_meshid_to_draw_buffer(meshid_t mesh, transform_t transform, std::vector tex) { // write the draw data. drawdata_storage_t& draw_data = tz::gl::get_device().get_renderer(this->rh).get_resource(this->drawdata_buf)->data_as().front(); drawdata_element_t& elem = draw_data.draws[this->draw_list.size()]; elem.model = tz::model(transform.pos, transform.rot, transform.scale); - elem.textures[0] = {.tint = {1.0f, 1.0f, 1.0f}, .texid = tex}; + tz::assert(tex.size() == 2, "Textures supported: {colour, normal}. You have specified %zu, we want 2.", tex.size()); + for(std::size_t i = 0; i < tex.size(); i++) + { + elem.textures[i] = {.tint = {1.0f, 1.0f, 1.0f}, .texid = tex[i]}; + } // write out the mesh reference. mesh_reference ref = this->get_reference(mesh); meshref_storage_t& storage = tz::gl::get_device().get_renderer(this->ch).get_resource(this->meshref_buf)->data_as().front(); diff --git a/demo/gl/tz_mesh_demo/mesh_renderer.hpp b/demo/gl/tz_mesh_demo/mesh_renderer.hpp index a593b00a2c..d707c1284c 100644 --- a/demo/gl/tz_mesh_demo/mesh_renderer.hpp +++ b/demo/gl/tz_mesh_demo/mesh_renderer.hpp @@ -80,12 +80,12 @@ class mesh_renderer texid_t add_texture(unsigned int width, unsigned int height, std::span imgdata); void push_back_timeline() const; - void add_to_draw_list(meshid_t mesh, transform_t transform = {}, texid_t tex = 0); + void add_to_draw_list(meshid_t mesh, transform_t transform = {}, std::vector tex = {}); void dbgui(); void update(float dt); private: void append_mesh_to_buffers(const mesh_t& mesh); - void append_meshid_to_draw_buffer(meshid_t mesh, transform_t transform, texid_t tex); + void append_meshid_to_draw_buffer(meshid_t mesh, transform_t transform, std::vector tex); mesh_reference get_reference(meshid_t mesh) const; void write_camera_buffer(); // draw indirect buffer diff --git a/demo/gl/tz_mesh_demo/shaders/mesh3d.fragment.tzsl b/demo/gl/tz_mesh_demo/shaders/mesh3d.fragment.tzsl index 8aa51ccc16..b4be686af7 100644 --- a/demo/gl/tz_mesh_demo/shaders/mesh3d.fragment.tzsl +++ b/demo/gl/tz_mesh_demo/shaders/mesh3d.fragment.tzsl @@ -10,15 +10,27 @@ struct texture_t output(id = 0) vec4 out::colour; input(id = 0) vec2 in::texc; -input(id = 1, flat) texture_t in::textures[TEX_COUNT]; +input(id = 1) vec3 in::norm; +input(id = 2, flat) texture_t in::textures[TEX_COUNT]; resource(id = 3) const texture textures[]; void main() { out::colour = vec4(vec3(0.0f), 1.0f); - for(uint i = 0; i < 1; i++) + + texture_t colour_tex = in::textures[0]; + vec3 tex_colour = texture(textures[colour_tex.texid], in::texc).xyz * colour_tex.tint; + + texture_t normal_tex = in::textures[1]; + vec3 norm = in::norm; + if(normal_tex.texid != 0) { - texture_t this_tex = in::textures[i]; - out::colour.xyz += texture(textures[this_tex.texid], in::texc).xyz * this_tex.tint; + vec3 sampled_normal = texture(textures[normal_tex.texid], in::texc).xyz; + vec3 tangent_normal = normalize(norm); + vec3 binormal = cross(vec3(0.0f, 1.0f, 0.0f), tangent_normal); + vec3 tangent = cross(tangent_normal, binormal); + mat3 tbn = mat3(tangent, binormal, tangent_normal); + norm = normalize(tbn * sampled_normal); } + out::colour.xyz = norm; } diff --git a/demo/gl/tz_mesh_demo/shaders/mesh3d.vertex.tzsl b/demo/gl/tz_mesh_demo/shaders/mesh3d.vertex.tzsl index 8c755f96b1..ca7f47817f 100644 --- a/demo/gl/tz_mesh_demo/shaders/mesh3d.vertex.tzsl +++ b/demo/gl/tz_mesh_demo/shaders/mesh3d.vertex.tzsl @@ -46,7 +46,8 @@ resource(id = 2) const buffer camera_buffer // OUTPUTS output(id = 0) vec2 out::texc; -output(id = 1) texture_t out::textures[TEX_COUNT]; +output(id = 1) vec3 out::norm; +output(id = 2) texture_t out::textures[TEX_COUNT]; void main() { @@ -54,6 +55,7 @@ void main() drawdata_t draw = draws.data[in::draw_id]; out::position = camera.p * camera.v * draw.model * vec4(vtx.pos, 1.0f); out::texc = vtx.texc; + out::norm = vtx.nrm; for(uint i = 0; i < TEX_COUNT; i++) {