From 957713cda7f28ec7839348240b17f3180e227bc2 Mon Sep 17 00:00:00 2001 From: Linloir <3145078758@qq.com> Date: Sun, 18 Dec 2022 10:49:07 +0800 Subject: [PATCH] [CORE][CHG] SkyBox Test --- FinalProject/FinalProject.vcxproj | 6 ++++++ FinalProject/FinalProject.vcxproj.filters | 18 ++++++++++++++++++ FinalProject/mainwindow.qrc | 4 ++++ FinalProject/sceneviewer.cpp | 20 ++++++++++++++++++++ FinalProject/sceneviewer.h | 2 +- FinalProject/skybox.cpp | 15 +++++++-------- FinalProject/skybox.h | 10 +++++----- FinalProject/skyboxfragmentshader.glsl | 11 +++++++++++ FinalProject/skyboxvertexshader.glsl | 15 +++++++++++++++ FinalProject/terrainfragmentshader.glsl | 13 +++++++++++++ FinalProject/terrainvertexshader.glsl | 22 ++++++++++++++++++++++ {skybox => SkyBoxes}/back.jpg | Bin {skybox => SkyBoxes}/bottom.jpg | Bin {skybox => SkyBoxes}/front.jpg | Bin {skybox => SkyBoxes}/left.jpg | Bin {skybox => SkyBoxes}/right.jpg | Bin {skybox => SkyBoxes}/top.jpg | Bin 17 files changed, 122 insertions(+), 14 deletions(-) create mode 100644 FinalProject/skyboxfragmentshader.glsl create mode 100644 FinalProject/skyboxvertexshader.glsl create mode 100644 FinalProject/terrainfragmentshader.glsl create mode 100644 FinalProject/terrainvertexshader.glsl rename {skybox => SkyBoxes}/back.jpg (100%) rename {skybox => SkyBoxes}/bottom.jpg (100%) rename {skybox => SkyBoxes}/front.jpg (100%) rename {skybox => SkyBoxes}/left.jpg (100%) rename {skybox => SkyBoxes}/right.jpg (100%) rename {skybox => SkyBoxes}/top.jpg (100%) diff --git a/FinalProject/FinalProject.vcxproj b/FinalProject/FinalProject.vcxproj index 17070a7..e72bef0 100644 --- a/FinalProject/FinalProject.vcxproj +++ b/FinalProject/FinalProject.vcxproj @@ -125,6 +125,7 @@ + @@ -153,6 +154,7 @@ + @@ -172,6 +174,10 @@ + + + + diff --git a/FinalProject/FinalProject.vcxproj.filters b/FinalProject/FinalProject.vcxproj.filters index 8ca5770..345923c 100644 --- a/FinalProject/FinalProject.vcxproj.filters +++ b/FinalProject/FinalProject.vcxproj.filters @@ -168,6 +168,9 @@ Source Files\OpenGL Abstractions + + Source Files\OpenGL Abstractions + @@ -212,6 +215,9 @@ Header Files\OpenGL Abstractions + + Header Files\OpenGL Abstractions + @@ -264,5 +270,17 @@ Resource Files + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + \ No newline at end of file diff --git a/FinalProject/mainwindow.qrc b/FinalProject/mainwindow.qrc index 81e5d7b..b2b86e7 100644 --- a/FinalProject/mainwindow.qrc +++ b/FinalProject/mainwindow.qrc @@ -2,6 +2,10 @@ fragmentshader.glsl vertexshader.glsl + skyboxvertexshader.glsl + terrainfragmentshader.glsl + terrainvertexshader.glsl + skyboxfragmentshader.glsl font_awesome_6_regular_free.otf diff --git a/FinalProject/sceneviewer.cpp b/FinalProject/sceneviewer.cpp index 5ef2e92..5e5b4d6 100644 --- a/FinalProject/sceneviewer.cpp +++ b/FinalProject/sceneviewer.cpp @@ -31,6 +31,8 @@ SceneViewer::SceneViewer(QWidget* parent) // Copy the shaders to the temp folder extractShaderResorce("vertexshader.glsl"); extractShaderResorce("fragmentshader.glsl"); + extractShaderResorce("skyboxvertexshader.glsl"); + extractShaderResorce("skyboxfragmentshader.glsl"); } SceneViewer::~SceneViewer() { @@ -76,7 +78,19 @@ void SceneViewer::initializeGL() { vertexShader.dispose(); fragmentShader.dispose(); + _skyShader.ensureInitialized(); + Logger::info("Sky Shader initialized"); + + VertexShader skyVertexShader("./temp/shaders/skyboxvertexshader.glsl"); + FragmentShader skyFragmentShader("./temp/shaders/skyboxfragmentshader.glsl"); + _skyShader.attachShader(skyVertexShader); + _skyShader.attachShader(skyFragmentShader); + skyVertexShader.dispose(); + skyFragmentShader.dispose(); + // Test Code Start + _sky = new SkyBox("E:\\Repositories\\CollegeProjects\\CGAssignments\\FinalProject\\SkyBoxes"); + _dirLight = new DirLight(); Model* model = new Model("E:\\Repositories\\CollegeProjects\\CGAssignments\\FinalProject\\Models\\backpack\\backpack.obj"); @@ -140,6 +154,12 @@ void SceneViewer::paintGL() { } _shaderProgram.unbind(); + + _skyShader.bind(); + _skyShader.setUniform("view", glm::mat4(glm::mat3(view))); + _skyShader.setUniform("projection", projection); + _sky->render(); + _skyShader.unbind(); } void SceneViewer::mousePressEvent(QMouseEvent* event) { diff --git a/FinalProject/sceneviewer.h b/FinalProject/sceneviewer.h index 8b1c9dd..4c35136 100644 --- a/FinalProject/sceneviewer.h +++ b/FinalProject/sceneviewer.h @@ -28,7 +28,7 @@ private: // Shader program for objects ShaderProgram _shaderProgram = ShaderProgram::empty(); ShaderProgram _skyShader = ShaderProgram::empty(); - skybox* sky; + SkyBox* _sky; // Main camera Camera _camera; float _cameraMovementSpeed = 0.02f; diff --git a/FinalProject/skybox.cpp b/FinalProject/skybox.cpp index ba2b009..f3061b8 100644 --- a/FinalProject/skybox.cpp +++ b/FinalProject/skybox.cpp @@ -1,13 +1,12 @@ -#include "utils.h" -#include "skybox.h" -#include "shader.h" -#include "camera.h" - #include #include #include -skybox::skybox(std::string path){ +#include "skybox.h" +#include "shader.h" +#include "camera.h" + +SkyBox::SkyBox(std::string path){ faces.clear(); faces.push_back(path + "/right.jpg"); faces.push_back(path + "/left.jpg"); @@ -27,7 +26,7 @@ skybox::skybox(std::string path){ OPENGL_EXTRA_FUNCTIONS->glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); } -void skybox::render() { +void SkyBox::render() { OPENGL_EXTRA_FUNCTIONS->glDepthFunc(GL_LEQUAL); // change depth function so depth test passes when values are equal to depth buffer's content // skybox cube OPENGL_EXTRA_FUNCTIONS->glBindVertexArray(skyboxVAO); @@ -38,7 +37,7 @@ void skybox::render() { OPENGL_EXTRA_FUNCTIONS->glDepthFunc(GL_LESS); // set depth function back to default } -unsigned int skybox::loadCubemap(std::vector faces) +unsigned int SkyBox::loadCubemap(std::vector faces) { unsigned int textureID; OPENGL_FUNCTIONS->glGenTextures(1, &textureID); diff --git a/FinalProject/skybox.h b/FinalProject/skybox.h index ba0f1ec..48c66e8 100644 --- a/FinalProject/skybox.h +++ b/FinalProject/skybox.h @@ -1,17 +1,17 @@ #pragma once +#include +#include + #include "utils.h" #include "shader.h" #include "camera.h" -#include -#include - -class skybox { +class SkyBox { public: std::vector faces; - skybox(std::string path); + SkyBox(std::string path); unsigned int cubemapTexture, skyboxVAO, skyboxVBO; void render(); private: diff --git a/FinalProject/skyboxfragmentshader.glsl b/FinalProject/skyboxfragmentshader.glsl new file mode 100644 index 0000000..5d0e53e --- /dev/null +++ b/FinalProject/skyboxfragmentshader.glsl @@ -0,0 +1,11 @@ +#version 330 core +out vec4 FragColor; + +in vec3 TexCoords; + +uniform samplerCube skybox; + +void main() +{ + FragColor = texture(skybox, TexCoords); +} \ No newline at end of file diff --git a/FinalProject/skyboxvertexshader.glsl b/FinalProject/skyboxvertexshader.glsl new file mode 100644 index 0000000..2a35233 --- /dev/null +++ b/FinalProject/skyboxvertexshader.glsl @@ -0,0 +1,15 @@ +#version 330 core +layout (location = 0) in vec3 aPos; + +out vec3 TexCoords; + +uniform mat4 projection; +uniform mat4 view; + +void main() +{ + TexCoords = aPos; + vec4 pos = projection * view * vec4(aPos, 1.0); + gl_Position = pos.xyww; + gl_Position.y = -gl_Position.y; +} \ No newline at end of file diff --git a/FinalProject/terrainfragmentshader.glsl b/FinalProject/terrainfragmentshader.glsl new file mode 100644 index 0000000..02255ad --- /dev/null +++ b/FinalProject/terrainfragmentshader.glsl @@ -0,0 +1,13 @@ +#version 330 core +out vec4 FragColor; + +in vec3 ourColor; +in vec2 TexCoord; + +// texture sampler +uniform sampler2D texture1; + +void main() +{ + FragColor = texture(texture1, TexCoord); +} \ No newline at end of file diff --git a/FinalProject/terrainvertexshader.glsl b/FinalProject/terrainvertexshader.glsl new file mode 100644 index 0000000..e19fa8b --- /dev/null +++ b/FinalProject/terrainvertexshader.glsl @@ -0,0 +1,22 @@ +#version 330 core +layout (location = 0) in vec3 aPos; +layout (location = 1) in vec3 aColor; +layout (location = 2) in vec2 aTexCoord; + +out vec3 ourColor; +out vec2 TexCoord; + +uniform mat4 model; +uniform mat4 view; +uniform mat4 projection; + +void main() +{ + gl_Position = projection * view * model * vec4(aPos, 1.0); + ourColor = aColor; + TexCoord = vec2(aTexCoord.x, aTexCoord.y); +} + + + + diff --git a/skybox/back.jpg b/SkyBoxes/back.jpg similarity index 100% rename from skybox/back.jpg rename to SkyBoxes/back.jpg diff --git a/skybox/bottom.jpg b/SkyBoxes/bottom.jpg similarity index 100% rename from skybox/bottom.jpg rename to SkyBoxes/bottom.jpg diff --git a/skybox/front.jpg b/SkyBoxes/front.jpg similarity index 100% rename from skybox/front.jpg rename to SkyBoxes/front.jpg diff --git a/skybox/left.jpg b/SkyBoxes/left.jpg similarity index 100% rename from skybox/left.jpg rename to SkyBoxes/left.jpg diff --git a/skybox/right.jpg b/SkyBoxes/right.jpg similarity index 100% rename from skybox/right.jpg rename to SkyBoxes/right.jpg diff --git a/skybox/top.jpg b/SkyBoxes/top.jpg similarity index 100% rename from skybox/top.jpg rename to SkyBoxes/top.jpg