From 363fa20d7e1668ed6321907d444bcb9d1921872c Mon Sep 17 00:00:00 2001 From: Woohyung Choi <201421062@sce212.ajou.ac.kr> Date: Thu, 12 Dec 2019 06:08:04 +0900 Subject: [PATCH] =?UTF-8?q?projective=20mapping=20=EC=A0=81=EC=9A=A9?= =?UTF-8?q?=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LearnOpenGL/OpenGLWrapper.cpp | 33 +++++++++++++++++++++++++++++++++ LearnOpenGL/OpenGLWrapper.h | 1 + LearnOpenGL/Source.cpp | 15 +++++++++++++-- 3 files changed, 47 insertions(+), 2 deletions(-) diff --git a/LearnOpenGL/OpenGLWrapper.cpp b/LearnOpenGL/OpenGLWrapper.cpp index 6744fa6..f000983 100644 --- a/LearnOpenGL/OpenGLWrapper.cpp +++ b/LearnOpenGL/OpenGLWrapper.cpp @@ -175,6 +175,39 @@ void RenderObject::render(Camera &camera) glUseProgram(0); } +void RenderObject::projective_render(Camera &camera) +{ + const glm::mat4 bias = { 0.5, 0.0, 0.0, 0.5, 0.0, 0.5, 0.0, 0.5, 0.0, 0.0, 0.5, 0.5, 0.0, 0.0, 0.0, 1.0 }; + glm::mat4 pp = glm::perspective(glm::radians(camera.Zoom), (float)_SCR_WIDTH / (float)_SCR_HEIGHT, 0.1f, 10.0f); + glm::mat4 pv = glm::lookAt(camera.Position, camera.Position + camera.Front, camera.Up); + glm::mat4 InvView = glm::inverse(camera.GetViewMatrix()); + glm::mat4 result = bias * pp * pv; + + auto prog = material->get_program(); + glUseProgram(prog); + + glm::mat4 projection = glm::perspective(glm::radians(camera.Zoom), (float)_SCR_WIDTH / (float)_SCR_HEIGHT, 0.1f, 500.0f); + glm::mat4 view = camera.GetViewMatrix(); + set_uniform_value(prog, "TexGenMatCam0", result); + set_uniform_value(prog, "projection", projection); + set_uniform_value(prog, "view", view); + set_uniform_value(prog, "model", model); + + { + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, material->get_diffuseMap()); + } + + { + glActiveTexture(GL_TEXTURE1); + glBindTexture(GL_TEXTURE_2D, material->get_specularMap()); + } + + draw_mesh(*mesh); + + glUseProgram(0); +} + RenderObject *make_render_object(Mesh *mesh) { RenderObject *ro = new RenderObject(mesh); diff --git a/LearnOpenGL/OpenGLWrapper.h b/LearnOpenGL/OpenGLWrapper.h index eb1a0b6..f2722ff 100644 --- a/LearnOpenGL/OpenGLWrapper.h +++ b/LearnOpenGL/OpenGLWrapper.h @@ -77,6 +77,7 @@ public: void set_material(Material *_material); void render(Camera &camera); + void projective_render(Camera &camera); }; RenderObject *make_render_object(Mesh *mesh); diff --git a/LearnOpenGL/Source.cpp b/LearnOpenGL/Source.cpp index da4f6a2..146a05f 100644 --- a/LearnOpenGL/Source.cpp +++ b/LearnOpenGL/Source.cpp @@ -57,6 +57,7 @@ int main() auto lamp = build_program("Lighting_Lamp"); auto lightmap = build_program("Lighting_Maps"); auto texture_shader = build_program("Texture"); + auto projector_shader = build_program("Projector"); auto cube = make_mesh("cube.obj"); @@ -66,12 +67,22 @@ int main() auto white = load_image("white.png"); auto transparent = load_image("transparent.png"); + auto wall = load_image("wall.jpg"); auto container_diffuse = load_image("container2.png"); auto container_specular = load_image("container2_specular.png"); auto defaultMaterial = new Material(lightmap, orange, transparent); auto cubeMaterial = new Material(lightmap, container_diffuse, container_specular); auto planeMaterial = new Material(lightmap, magenta, transparent); + auto projectorMaterial = new Material(projector_shader, transparent, transparent); + + auto projector = make_render_object(make_mesh("cube.obj")); + { + projector->set_translate(glm::vec3(0.0f, 10.0f, 0.0f)); + } + { + projector->set_material(projectorMaterial); + } auto teapot = make_render_object(make_mesh("teapot.obj")); { @@ -79,7 +90,7 @@ int main() teapot->set_rotate(glm::vec3(-90.0f, 0.0f, 0.0f)); } { - teapot->set_material(defaultMaterial); + teapot->set_material(projectorMaterial); } auto cube1 = make_render_object(cube); @@ -140,7 +151,7 @@ int main() glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); { - teapot->render(camera); + teapot->projective_render(camera); cube1->render(camera); cube2->render(camera); cube3->render(camera); -- GitLab