diff --git a/cw 9/grk-cw9.vcxproj b/cw 9/grk-cw9.vcxproj
index d0f7400..4acac8a 100644
--- a/cw 9/grk-cw9.vcxproj
+++ b/cw 9/grk-cw9.vcxproj
@@ -41,6 +41,8 @@
+
+
@@ -80,7 +82,7 @@
false
$(SolutionDir)dependencies\freeglut\lib;$(SolutionDir)dependencies\glew-2.0.0\lib\Release\Win32;$(SolutionDir)dependencies\glfw-3.3.8.bin.WIN32\lib-vc2019;$(SolutionDir)dependencies\assimp;$(LibraryPath)
- $(SolutionDir)dependencies\freeglut\include\GL;$(SolutionDir)dependencies\glew-2.0.0\include\GL;$(SolutionDir)dependencies\glm;$(SolutionDir)dependencies\glfw-3.3.8.bin.WIN32\include;$(SolutionDir)dependencies\assimp\include;$(IncludePath)
+ $(SolutionDir)dependencies\freeglut\include\GL;$(SolutionDir)dependencies\soil;$(SolutionDir)dependencies\glew-2.0.0\include\GL;$(SolutionDir)dependencies\glm;$(SolutionDir)dependencies\glfw-3.3.8.bin.WIN32\include;$(SolutionDir)dependencies\assimp\include;$(IncludePath)
$(ExecutablePath)
diff --git a/cw 9/grk-cw9.vcxproj.filters b/cw 9/grk-cw9.vcxproj.filters
index 81c9f85..239071c 100644
--- a/cw 9/grk-cw9.vcxproj.filters
+++ b/cw 9/grk-cw9.vcxproj.filters
@@ -103,9 +103,6 @@
Shader Files
-
- Shader Files
-
Shader Files
@@ -115,5 +112,8 @@
Shader Files
+
+
+
\ No newline at end of file
diff --git a/cw 9/shaders/shader_skybox.frag b/cw 9/shaders/shader_skybox.frag
new file mode 100644
index 0000000..93ad10d
--- /dev/null
+++ b/cw 9/shaders/shader_skybox.frag
@@ -0,0 +1,11 @@
+#version 330 core
+out vec4 FragColor;
+
+in vec3 TexCoord;
+
+uniform samplerCube skybox;
+
+void main()
+{
+ FragColor = texture(skybox, TexCoord);
+}
\ No newline at end of file
diff --git a/cw 9/shaders/shader_skybox.vert b/cw 9/shaders/shader_skybox.vert
new file mode 100644
index 0000000..8d86eaa
--- /dev/null
+++ b/cw 9/shaders/shader_skybox.vert
@@ -0,0 +1,13 @@
+#version 330 core
+layout(location = 0) in vec3 aPos;
+
+out vec3 TexCoord;
+
+uniform mat4 transformation;
+
+void main()
+{
+ vec4 pos = transformation * vec4(aPos, 1.0f);
+ gl_Position = vec4(pos.x, pos.y, pos.w, pos.w);
+ TexCoord = vec3(aPos.x, aPos.y, -aPos.z);
+}
diff --git a/cw 9/src/SOIL.h b/cw 9/src/SOIL.h
new file mode 100644
index 0000000..43f634f
--- /dev/null
+++ b/cw 9/src/SOIL.h
@@ -0,0 +1,433 @@
+/**
+ @mainpage SOIL
+
+ Jonathan Dummer
+ 2007-07-26-10.36
+
+ Simple OpenGL Image Library
+
+ A tiny c library for uploading images as
+ textures into OpenGL. Also saving and
+ loading of images is supported.
+
+ I'm using Sean's Tool Box image loader as a base:
+ http://www.nothings.org/
+
+ I'm upgrading it to load TGA and DDS files, and a direct
+ path for loading DDS files straight into OpenGL textures,
+ when applicable.
+
+ Image Formats:
+ - BMP load & save
+ - TGA load & save
+ - DDS load & save
+ - PNG load
+ - JPG load
+
+ OpenGL Texture Features:
+ - resample to power-of-two sizes
+ - MIPmap generation
+ - compressed texture S3TC formats (if supported)
+ - can pre-multiply alpha for you, for better compositing
+ - can flip image about the y-axis (except pre-compressed DDS files)
+
+ Thanks to:
+ * Sean Barret - for the awesome stb_image
+ * Dan Venkitachalam - for finding some non-compliant DDS files, and patching some explicit casts
+ * everybody at gamedev.net
+**/
+
+#ifndef HEADER_SIMPLE_OPENGL_IMAGE_LIBRARY
+#define HEADER_SIMPLE_OPENGL_IMAGE_LIBRARY
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ The format of images that may be loaded (force_channels).
+ SOIL_LOAD_AUTO leaves the image in whatever format it was found.
+ SOIL_LOAD_L forces the image to load as Luminous (greyscale)
+ SOIL_LOAD_LA forces the image to load as Luminous with Alpha
+ SOIL_LOAD_RGB forces the image to load as Red Green Blue
+ SOIL_LOAD_RGBA forces the image to load as Red Green Blue Alpha
+**/
+enum
+{
+ SOIL_LOAD_AUTO = 0,
+ SOIL_LOAD_L = 1,
+ SOIL_LOAD_LA = 2,
+ SOIL_LOAD_RGB = 3,
+ SOIL_LOAD_RGBA = 4
+};
+
+/**
+ Passed in as reuse_texture_ID, will cause SOIL to
+ register a new texture ID using glGenTextures().
+ If the value passed into reuse_texture_ID > 0 then
+ SOIL will just re-use that texture ID (great for
+ reloading image assets in-game!)
+**/
+enum
+{
+ SOIL_CREATE_NEW_ID = 0
+};
+
+/**
+ flags you can pass into SOIL_load_OGL_texture()
+ and SOIL_create_OGL_texture().
+ (note that if SOIL_FLAG_DDS_LOAD_DIRECT is used
+ the rest of the flags with the exception of
+ SOIL_FLAG_TEXTURE_REPEATS will be ignored while
+ loading already-compressed DDS files.)
+
+ SOIL_FLAG_POWER_OF_TWO: force the image to be POT
+ SOIL_FLAG_MIPMAPS: generate mipmaps for the texture
+ SOIL_FLAG_TEXTURE_REPEATS: otherwise will clamp
+ SOIL_FLAG_MULTIPLY_ALPHA: for using (GL_ONE,GL_ONE_MINUS_SRC_ALPHA) blending
+ SOIL_FLAG_INVERT_Y: flip the image vertically
+ SOIL_FLAG_COMPRESS_TO_DXT: if the card can display them, will convert RGB to DXT1, RGBA to DXT5
+ SOIL_FLAG_DDS_LOAD_DIRECT: will load DDS files directly without _ANY_ additional processing
+ SOIL_FLAG_NTSC_SAFE_RGB: clamps RGB components to the range [16,235]
+ SOIL_FLAG_CoCg_Y: Google YCoCg; RGB=>CoYCg, RGBA=>CoCgAY
+ SOIL_FLAG_TEXTURE_RECTANGE: uses ARB_texture_rectangle ; pixel indexed & no repeat or MIPmaps or cubemaps
+**/
+enum
+{
+ SOIL_FLAG_POWER_OF_TWO = 1,
+ SOIL_FLAG_MIPMAPS = 2,
+ SOIL_FLAG_TEXTURE_REPEATS = 4,
+ SOIL_FLAG_MULTIPLY_ALPHA = 8,
+ SOIL_FLAG_INVERT_Y = 16,
+ SOIL_FLAG_COMPRESS_TO_DXT = 32,
+ SOIL_FLAG_DDS_LOAD_DIRECT = 64,
+ SOIL_FLAG_NTSC_SAFE_RGB = 128,
+ SOIL_FLAG_CoCg_Y = 256,
+ SOIL_FLAG_TEXTURE_RECTANGLE = 512
+};
+
+/**
+ The types of images that may be saved.
+ (TGA supports uncompressed RGB / RGBA)
+ (BMP supports uncompressed RGB)
+ (DDS supports DXT1 and DXT5)
+**/
+enum
+{
+ SOIL_SAVE_TYPE_TGA = 0,
+ SOIL_SAVE_TYPE_BMP = 1,
+ SOIL_SAVE_TYPE_DDS = 2
+};
+
+/**
+ Defines the order of faces in a DDS cubemap.
+ I recommend that you use the same order in single
+ image cubemap files, so they will be interchangeable
+ with DDS cubemaps when using SOIL.
+**/
+#define SOIL_DDS_CUBEMAP_FACE_ORDER "EWUDNS"
+
+/**
+ The types of internal fake HDR representations
+
+ SOIL_HDR_RGBE: RGB * pow( 2.0, A - 128.0 )
+ SOIL_HDR_RGBdivA: RGB / A
+ SOIL_HDR_RGBdivA2: RGB / (A*A)
+**/
+enum
+{
+ SOIL_HDR_RGBE = 0,
+ SOIL_HDR_RGBdivA = 1,
+ SOIL_HDR_RGBdivA2 = 2
+};
+
+/**
+ Loads an image from disk into an OpenGL texture.
+ \param filename the name of the file to upload as a texture
+ \param force_channels 0-image format, 1-luminous, 2-luminous/alpha, 3-RGB, 4-RGBA
+ \param reuse_texture_ID 0-generate a new texture ID, otherwise reuse the texture ID (overwriting the old texture)
+ \param flags can be any of SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_MIPMAPS | SOIL_FLAG_TEXTURE_REPEATS | SOIL_FLAG_MULTIPLY_ALPHA | SOIL_FLAG_INVERT_Y | SOIL_FLAG_COMPRESS_TO_DXT | SOIL_FLAG_DDS_LOAD_DIRECT
+ \return 0-failed, otherwise returns the OpenGL texture handle
+**/
+unsigned int
+ SOIL_load_OGL_texture
+ (
+ const char *filename,
+ int force_channels,
+ unsigned int reuse_texture_ID,
+ unsigned int flags
+ );
+
+/**
+ Loads 6 images from disk into an OpenGL cubemap texture.
+ \param x_pos_file the name of the file to upload as the +x cube face
+ \param x_neg_file the name of the file to upload as the -x cube face
+ \param y_pos_file the name of the file to upload as the +y cube face
+ \param y_neg_file the name of the file to upload as the -y cube face
+ \param z_pos_file the name of the file to upload as the +z cube face
+ \param z_neg_file the name of the file to upload as the -z cube face
+ \param force_channels 0-image format, 1-luminous, 2-luminous/alpha, 3-RGB, 4-RGBA
+ \param reuse_texture_ID 0-generate a new texture ID, otherwise reuse the texture ID (overwriting the old texture)
+ \param flags can be any of SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_MIPMAPS | SOIL_FLAG_TEXTURE_REPEATS | SOIL_FLAG_MULTIPLY_ALPHA | SOIL_FLAG_INVERT_Y | SOIL_FLAG_COMPRESS_TO_DXT | SOIL_FLAG_DDS_LOAD_DIRECT
+ \return 0-failed, otherwise returns the OpenGL texture handle
+**/
+unsigned int
+ SOIL_load_OGL_cubemap
+ (
+ const char *x_pos_file,
+ const char *x_neg_file,
+ const char *y_pos_file,
+ const char *y_neg_file,
+ const char *z_pos_file,
+ const char *z_neg_file,
+ int force_channels,
+ unsigned int reuse_texture_ID,
+ unsigned int flags
+ );
+
+/**
+ Loads 1 image from disk and splits it into an OpenGL cubemap texture.
+ \param filename the name of the file to upload as a texture
+ \param face_order the order of the faces in the file, any combination of NSWEUD, for North, South, Up, etc.
+ \param force_channels 0-image format, 1-luminous, 2-luminous/alpha, 3-RGB, 4-RGBA
+ \param reuse_texture_ID 0-generate a new texture ID, otherwise reuse the texture ID (overwriting the old texture)
+ \param flags can be any of SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_MIPMAPS | SOIL_FLAG_TEXTURE_REPEATS | SOIL_FLAG_MULTIPLY_ALPHA | SOIL_FLAG_INVERT_Y | SOIL_FLAG_COMPRESS_TO_DXT | SOIL_FLAG_DDS_LOAD_DIRECT
+ \return 0-failed, otherwise returns the OpenGL texture handle
+**/
+unsigned int
+ SOIL_load_OGL_single_cubemap
+ (
+ const char *filename,
+ const char face_order[6],
+ int force_channels,
+ unsigned int reuse_texture_ID,
+ unsigned int flags
+ );
+
+/**
+ Loads an HDR image from disk into an OpenGL texture.
+ \param filename the name of the file to upload as a texture
+ \param fake_HDR_format SOIL_HDR_RGBE, SOIL_HDR_RGBdivA, SOIL_HDR_RGBdivA2
+ \param reuse_texture_ID 0-generate a new texture ID, otherwise reuse the texture ID (overwriting the old texture)
+ \param flags can be any of SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_MIPMAPS | SOIL_FLAG_TEXTURE_REPEATS | SOIL_FLAG_MULTIPLY_ALPHA | SOIL_FLAG_INVERT_Y | SOIL_FLAG_COMPRESS_TO_DXT
+ \return 0-failed, otherwise returns the OpenGL texture handle
+**/
+unsigned int
+ SOIL_load_OGL_HDR_texture
+ (
+ const char *filename,
+ int fake_HDR_format,
+ int rescale_to_max,
+ unsigned int reuse_texture_ID,
+ unsigned int flags
+ );
+
+/**
+ Loads an image from RAM into an OpenGL texture.
+ \param buffer the image data in RAM just as if it were still in a file
+ \param buffer_length the size of the buffer in bytes
+ \param force_channels 0-image format, 1-luminous, 2-luminous/alpha, 3-RGB, 4-RGBA
+ \param reuse_texture_ID 0-generate a new texture ID, otherwise reuse the texture ID (overwriting the old texture)
+ \param flags can be any of SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_MIPMAPS | SOIL_FLAG_TEXTURE_REPEATS | SOIL_FLAG_MULTIPLY_ALPHA | SOIL_FLAG_INVERT_Y | SOIL_FLAG_COMPRESS_TO_DXT | SOIL_FLAG_DDS_LOAD_DIRECT
+ \return 0-failed, otherwise returns the OpenGL texture handle
+**/
+unsigned int
+ SOIL_load_OGL_texture_from_memory
+ (
+ const unsigned char *const buffer,
+ int buffer_length,
+ int force_channels,
+ unsigned int reuse_texture_ID,
+ unsigned int flags
+ );
+
+/**
+ Loads 6 images from memory into an OpenGL cubemap texture.
+ \param x_pos_buffer the image data in RAM to upload as the +x cube face
+ \param x_pos_buffer_length the size of the above buffer
+ \param x_neg_buffer the image data in RAM to upload as the +x cube face
+ \param x_neg_buffer_length the size of the above buffer
+ \param y_pos_buffer the image data in RAM to upload as the +x cube face
+ \param y_pos_buffer_length the size of the above buffer
+ \param y_neg_buffer the image data in RAM to upload as the +x cube face
+ \param y_neg_buffer_length the size of the above buffer
+ \param z_pos_buffer the image data in RAM to upload as the +x cube face
+ \param z_pos_buffer_length the size of the above buffer
+ \param z_neg_buffer the image data in RAM to upload as the +x cube face
+ \param z_neg_buffer_length the size of the above buffer
+ \param force_channels 0-image format, 1-luminous, 2-luminous/alpha, 3-RGB, 4-RGBA
+ \param reuse_texture_ID 0-generate a new texture ID, otherwise reuse the texture ID (overwriting the old texture)
+ \param flags can be any of SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_MIPMAPS | SOIL_FLAG_TEXTURE_REPEATS | SOIL_FLAG_MULTIPLY_ALPHA | SOIL_FLAG_INVERT_Y | SOIL_FLAG_COMPRESS_TO_DXT | SOIL_FLAG_DDS_LOAD_DIRECT
+ \return 0-failed, otherwise returns the OpenGL texture handle
+**/
+unsigned int
+ SOIL_load_OGL_cubemap_from_memory
+ (
+ const unsigned char *const x_pos_buffer,
+ int x_pos_buffer_length,
+ const unsigned char *const x_neg_buffer,
+ int x_neg_buffer_length,
+ const unsigned char *const y_pos_buffer,
+ int y_pos_buffer_length,
+ const unsigned char *const y_neg_buffer,
+ int y_neg_buffer_length,
+ const unsigned char *const z_pos_buffer,
+ int z_pos_buffer_length,
+ const unsigned char *const z_neg_buffer,
+ int z_neg_buffer_length,
+ int force_channels,
+ unsigned int reuse_texture_ID,
+ unsigned int flags
+ );
+
+/**
+ Loads 1 image from RAM and splits it into an OpenGL cubemap texture.
+ \param buffer the image data in RAM just as if it were still in a file
+ \param buffer_length the size of the buffer in bytes
+ \param face_order the order of the faces in the file, any combination of NSWEUD, for North, South, Up, etc.
+ \param force_channels 0-image format, 1-luminous, 2-luminous/alpha, 3-RGB, 4-RGBA
+ \param reuse_texture_ID 0-generate a new texture ID, otherwise reuse the texture ID (overwriting the old texture)
+ \param flags can be any of SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_MIPMAPS | SOIL_FLAG_TEXTURE_REPEATS | SOIL_FLAG_MULTIPLY_ALPHA | SOIL_FLAG_INVERT_Y | SOIL_FLAG_COMPRESS_TO_DXT | SOIL_FLAG_DDS_LOAD_DIRECT
+ \return 0-failed, otherwise returns the OpenGL texture handle
+**/
+unsigned int
+ SOIL_load_OGL_single_cubemap_from_memory
+ (
+ const unsigned char *const buffer,
+ int buffer_length,
+ const char face_order[6],
+ int force_channels,
+ unsigned int reuse_texture_ID,
+ unsigned int flags
+ );
+
+/**
+ Creates a 2D OpenGL texture from raw image data. Note that the raw data is
+ _NOT_ freed after the upload (so the user can load various versions).
+ \param data the raw data to be uploaded as an OpenGL texture
+ \param width the width of the image in pixels
+ \param height the height of the image in pixels
+ \param channels the number of channels: 1-luminous, 2-luminous/alpha, 3-RGB, 4-RGBA
+ \param reuse_texture_ID 0-generate a new texture ID, otherwise reuse the texture ID (overwriting the old texture)
+ \param flags can be any of SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_MIPMAPS | SOIL_FLAG_TEXTURE_REPEATS | SOIL_FLAG_MULTIPLY_ALPHA | SOIL_FLAG_INVERT_Y | SOIL_FLAG_COMPRESS_TO_DXT
+ \return 0-failed, otherwise returns the OpenGL texture handle
+**/
+unsigned int
+ SOIL_create_OGL_texture
+ (
+ const unsigned char *const data,
+ int width, int height, int channels,
+ unsigned int reuse_texture_ID,
+ unsigned int flags
+ );
+
+/**
+ Creates an OpenGL cubemap texture by splitting up 1 image into 6 parts.
+ \param data the raw data to be uploaded as an OpenGL texture
+ \param width the width of the image in pixels
+ \param height the height of the image in pixels
+ \param channels the number of channels: 1-luminous, 2-luminous/alpha, 3-RGB, 4-RGBA
+ \param face_order the order of the faces in the file, and combination of NSWEUD, for North, South, Up, etc.
+ \param reuse_texture_ID 0-generate a new texture ID, otherwise reuse the texture ID (overwriting the old texture)
+ \param flags can be any of SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_MIPMAPS | SOIL_FLAG_TEXTURE_REPEATS | SOIL_FLAG_MULTIPLY_ALPHA | SOIL_FLAG_INVERT_Y | SOIL_FLAG_COMPRESS_TO_DXT | SOIL_FLAG_DDS_LOAD_DIRECT
+ \return 0-failed, otherwise returns the OpenGL texture handle
+**/
+unsigned int
+ SOIL_create_OGL_single_cubemap
+ (
+ const unsigned char *const data,
+ int width, int height, int channels,
+ const char face_order[6],
+ unsigned int reuse_texture_ID,
+ unsigned int flags
+ );
+
+/**
+ Captures the OpenGL window (RGB) and saves it to disk
+ \return 0 if it failed, otherwise returns 1
+**/
+int
+ SOIL_save_screenshot
+ (
+ const char *filename,
+ int image_type,
+ int x, int y,
+ int width, int height
+ );
+
+/**
+ Loads an image from disk into an array of unsigned chars.
+ Note that *channels return the original channel count of the
+ image. If force_channels was other than SOIL_LOAD_AUTO,
+ the resulting image has force_channels, but *channels may be
+ different (if the original image had a different channel
+ count).
+ \return 0 if failed, otherwise returns 1
+**/
+unsigned char*
+ SOIL_load_image
+ (
+ const char *filename,
+ int *width, int *height, int *channels,
+ int force_channels
+ );
+
+/**
+ Loads an image from memory into an array of unsigned chars.
+ Note that *channels return the original channel count of the
+ image. If force_channels was other than SOIL_LOAD_AUTO,
+ the resulting image has force_channels, but *channels may be
+ different (if the original image had a different channel
+ count).
+ \return 0 if failed, otherwise returns 1
+**/
+unsigned char*
+ SOIL_load_image_from_memory
+ (
+ const unsigned char *const buffer,
+ int buffer_length,
+ int *width, int *height, int *channels,
+ int force_channels
+ );
+
+/**
+ Saves an image from an array of unsigned chars (RGBA) to disk
+ \return 0 if failed, otherwise returns 1
+**/
+int
+ SOIL_save_image
+ (
+ const char *filename,
+ int image_type,
+ int width, int height, int channels,
+ const unsigned char *const data
+ );
+
+/**
+ Frees the image data (note, this is just C's "free()"...this function is
+ present mostly so C++ programmers don't forget to use "free()" and call
+ "delete []" instead [8^)
+**/
+void
+ SOIL_free_image_data
+ (
+ unsigned char *img_data
+ );
+
+/**
+ This function resturn a pointer to a string describing the last thing
+ that happened inside SOIL. It can be used to determine why an image
+ failed to load.
+**/
+const char*
+ SOIL_last_result
+ (
+ void
+ );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* HEADER_SIMPLE_OPENGL_IMAGE_LIBRARY */
diff --git a/cw 9/src/ex_9_1.hpp b/cw 9/src/ex_9_1.hpp
index 6ecf7a3..e586d5c 100644
--- a/cw 9/src/ex_9_1.hpp
+++ b/cw 9/src/ex_9_1.hpp
@@ -7,6 +7,7 @@
#include "Shader_Loader.h"
#include "Render_Utils.h"
+#include "SOIL.h"
//#include "Texture.h"
#include "Box.cpp"
@@ -51,6 +52,7 @@ GLuint depthMapFBO;
GLuint depthMap;
GLuint program;
+GLuint programSkybox;
GLuint programSun;
GLuint programTest;
GLuint programTex;
@@ -85,7 +87,49 @@ glm::vec3 spotlightConeDir = glm::vec3(0, 0, 0);
glm::vec3 spotlightColor = glm::vec3(0.4, 0.4, 0.9)*5;
float spotlightPhi = 3.14 / 4;
+float skyboxVertices[] =
+{
+ -150.0f, -150.0f, 150.0f,
+ 150.0f, -150.0f, 150.0f,
+ 150.0f, -150.0f, -150.0f,
+ -150.0f, -150.0f, -150.0f,
+ -150.0f, 150.0f, 150.0f,
+ 150.0f, 150.0f, 150.0f,
+ 150.0f, 150.0f, -150.0f,
+ -150.0f, 150.0f, -150.0f
+};
+//
+unsigned int skyboxIndices[] =
+{
+ 1, 2, 6,
+ 6, 5, 1,
+ 0, 4, 7,
+ 7, 3, 0,
+ 4, 5, 6,
+ 6, 7, 4,
+ 0, 3, 2,
+ 2, 1, 0,
+ 0, 1, 5,
+ 5, 4, 0,
+ 3, 7, 6,
+ 6, 2, 3
+};
+
+std::string facesCubemap[6] =
+{
+ "./textures/skybox/rt.png",
+ "./textures/skybox/lt.png",
+ "./textures/skybox/tp.png",
+ "./textures/skybox/bm.png",
+ "./textures/skybox/ft.png",
+ "./textures/skybox/bk.png"
+};
+
+unsigned int cubemapTexture;
+
+unsigned int skyboxVAO, skyboxVBO, skyboxEBO;
+//
float lastTime = -1.f;
float deltaTime = 0.f;
@@ -220,15 +264,38 @@ void renderScene(GLFWwindow* window)
{
glClearColor(0.4f, 0.4f, 0.8f, 1.0f);
glEnable(GL_BLEND);
+ glEnable(GL_DEPTH_TEST);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
float time = glfwGetTime();
updateDeltaTime(time);
+
+ //drawing skybox
+ glDepthFunc(GL_LEQUAL);
+ glDisable(GL_DEPTH_TEST);
+ glDepthMask(GL_FALSE);
+
+ glUseProgram(programSkybox);
+ glm::mat4 viewProjectionMatrix = createPerspectiveMatrix() * createCameraMatrix();
+ glm::mat4 transformationSky = viewProjectionMatrix * glm::translate(cameraPos) * glm::scale(glm::vec3(0.1));
+ glUniformMatrix4fv(glGetUniformLocation(programSkybox, "transformation"), 1, GL_FALSE, (float*)&transformationSky);
+
+ glBindVertexArray(skyboxVAO);
+ glActiveTexture(GL_TEXTURE0);
+ glBindTexture(GL_TEXTURE_CUBE_MAP, cubemapTexture);
+ glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, 0);
+ glBindVertexArray(0);
+
+ glDepthFunc(GL_LESS);
+ glEnable(GL_DEPTH_TEST);
+ glDepthMask(GL_TRUE);
+ //
+
glm::mat4 lightVPSun = glm::ortho(-3.f, 2.3f, -1.3f, 3.f, -1.0f, 40.0f) * glm::lookAt(sunPos, sunPos - sunDir, glm::vec3(0, 1, 0));
renderShadowapSun(depthMapFBO, lightVPSun);
//space lamp
glUseProgram(programSun);
- glm::mat4 viewProjectionMatrix = createPerspectiveMatrix() * createCameraMatrix();
+ //glm::mat4 viewProjectionMatrix = createPerspectiveMatrix() * createCameraMatrix();
glm::mat4 transformation = viewProjectionMatrix * glm::translate(pointlightPos) * glm::scale(glm::vec3(0.1));
glUniformMatrix4fv(glGetUniformLocation(programSun, "transformation"), 1, GL_FALSE, (float*)&transformation);
glUniform3f(glGetUniformLocation(programSun, "color"), sunColor.x / 2, sunColor.y / 2, sunColor.z / 2);
@@ -276,7 +343,6 @@ void renderScene(GLFWwindow* window)
0.,0.,0.,1.,
});
-
//drawObjectColor(shipContext,
// glm::translate(cameraPos + 1.5 * cameraDir + cameraUp * -0.5f) * inveseCameraRotrationMatrix * glm::eulerAngleY(glm::pi()),
// glm::vec3(0.3, 0.3, 0.5)
@@ -290,8 +356,6 @@ void renderScene(GLFWwindow* window)
spotlightPos = spaceshipPos + 0.2 * spaceshipDir;
spotlightConeDir = spaceshipDir;
-
-
//test depth buffer
//glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//glUseProgram(programTest);
@@ -302,6 +366,7 @@ void renderScene(GLFWwindow* window)
glUseProgram(0);
glfwSwapBuffers(window);
}
+
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
aspectRatio = width / float(height);
@@ -358,6 +423,44 @@ void init(GLFWwindow* window)
loadModelToContext("./models/Shelf.obj", models::shelfContext);
loadModelToContext("./models/fish.obj", models::fishContext);
loadModelToContext("./models/Glass_wall.obj", models::glassWallContext);
+
+ //prepering skybox
+ programSkybox = shaderLoader.CreateProgram("shaders/shader_skybox.vert", "shaders/shader_skybox.frag");
+ glUseProgram(programSkybox);
+ glUniform1i(glGetUniformLocation(programSkybox, "skybox"), 0);
+
+ glGenVertexArrays(1, &skyboxVAO);
+ glGenBuffers(1, &skyboxVBO);
+ glGenBuffers(1, &skyboxEBO);
+ glBindVertexArray(skyboxVAO);
+ glBindBuffer(GL_ARRAY_BUFFER, skyboxVBO);
+ glBufferData(GL_ARRAY_BUFFER, sizeof(skyboxVertices), &skyboxVertices, GL_STATIC_DRAW);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, skyboxEBO);
+ glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(skyboxIndices), &skyboxIndices, GL_STATIC_DRAW);
+ glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
+ glEnableVertexAttribArray(0);
+ glBindBuffer(GL_ARRAY_BUFFER, 0);
+ glBindVertexArray(0);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
+
+ glGenTextures(1, &cubemapTexture);
+ glBindTexture(GL_TEXTURE_CUBE_MAP, cubemapTexture);
+ glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
+
+ for (unsigned int i = 0; i < 6; i++)
+ {
+ int w, h;
+ unsigned char* data = SOIL_load_image(facesCubemap[i].c_str(), &w, &h, 0, SOIL_LOAD_RGBA);
+ glTexImage2D(
+ GL_TEXTURE_CUBE_MAP_POSITIVE_X + i,
+ 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, data
+ );
+ }
+ //
}
void shutdown(GLFWwindow* window)
diff --git a/cw 9/textures/skybox/back.png b/cw 9/textures/skybox/back.png
new file mode 100644
index 0000000..e7f4978
Binary files /dev/null and b/cw 9/textures/skybox/back.png differ
diff --git a/cw 9/textures/skybox/bk.png b/cw 9/textures/skybox/bk.png
new file mode 100644
index 0000000..232c7f0
Binary files /dev/null and b/cw 9/textures/skybox/bk.png differ
diff --git a/cw 9/textures/skybox/bm.png b/cw 9/textures/skybox/bm.png
new file mode 100644
index 0000000..9d8ffb2
Binary files /dev/null and b/cw 9/textures/skybox/bm.png differ
diff --git a/cw 9/textures/skybox/bottom.png b/cw 9/textures/skybox/bottom.png
new file mode 100644
index 0000000..514415b
Binary files /dev/null and b/cw 9/textures/skybox/bottom.png differ
diff --git a/cw 9/textures/skybox/front.png b/cw 9/textures/skybox/front.png
new file mode 100644
index 0000000..31b4daf
Binary files /dev/null and b/cw 9/textures/skybox/front.png differ
diff --git a/cw 9/textures/skybox/ft.png b/cw 9/textures/skybox/ft.png
new file mode 100644
index 0000000..ad05e2b
Binary files /dev/null and b/cw 9/textures/skybox/ft.png differ
diff --git a/cw 9/textures/skybox/left.png b/cw 9/textures/skybox/left.png
new file mode 100644
index 0000000..4f60d04
Binary files /dev/null and b/cw 9/textures/skybox/left.png differ
diff --git a/cw 9/textures/skybox/lt.png b/cw 9/textures/skybox/lt.png
new file mode 100644
index 0000000..83ccc0c
Binary files /dev/null and b/cw 9/textures/skybox/lt.png differ
diff --git a/cw 9/textures/skybox/right.png b/cw 9/textures/skybox/right.png
new file mode 100644
index 0000000..7ca9cae
Binary files /dev/null and b/cw 9/textures/skybox/right.png differ
diff --git a/cw 9/textures/skybox/rt.png b/cw 9/textures/skybox/rt.png
new file mode 100644
index 0000000..7cfc67b
Binary files /dev/null and b/cw 9/textures/skybox/rt.png differ
diff --git a/cw 9/textures/skybox/top.png b/cw 9/textures/skybox/top.png
new file mode 100644
index 0000000..28d5204
Binary files /dev/null and b/cw 9/textures/skybox/top.png differ
diff --git a/cw 9/textures/skybox/tp.png b/cw 9/textures/skybox/tp.png
new file mode 100644
index 0000000..c8c6879
Binary files /dev/null and b/cw 9/textures/skybox/tp.png differ
diff --git a/dependencies/soil/SOIL.lib b/dependencies/soil/SOIL.lib
new file mode 100644
index 0000000..e77c460
Binary files /dev/null and b/dependencies/soil/SOIL.lib differ