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