├── .gitignore ├── CMakeLists.txt ├── README.md ├── resources ├── objects │ ├── nanosuit │ │ ├── LICENSE.txt │ │ ├── arm_dif.png │ │ ├── arm_showroom_ddn.png │ │ ├── arm_showroom_spec.png │ │ ├── body_dif.png │ │ ├── body_showroom_ddn.png │ │ ├── body_showroom_spec.png │ │ ├── glass_ddn.png │ │ ├── glass_dif.png │ │ ├── hand_dif.png │ │ ├── hand_showroom_ddn.png │ │ ├── hand_showroom_spec.png │ │ ├── helmet_diff.png │ │ ├── helmet_showroom_ddn.png │ │ ├── helmet_showroom_spec.png │ │ ├── leg_dif.png │ │ ├── leg_showroom_ddn.png │ │ ├── leg_showroom_spec.png │ │ ├── nanosuit.blend │ │ ├── nanosuit.mtl │ │ └── nanosuit.obj │ ├── planet │ │ ├── planet.mtl │ │ └── planet_Quom1200.png │ └── rock │ │ ├── Rock-Texture-Surface.jpg │ │ └── rock.mtl ├── readme │ └── window.png ├── resources.qrc └── textures │ ├── awesomeface.png │ ├── container.jpg │ ├── container2.png │ ├── container2_specular.png │ ├── grass.png │ ├── marble.jpg │ ├── matrix.jpg │ ├── metal.png │ ├── skybox │ ├── back.jpg │ ├── bottom.jpg │ ├── front.jpg │ ├── left.jpg │ ├── right.jpg │ └── top.jpg │ ├── window.png │ └── wood.png └── src ├── 1.getting_started ├── 1.1hello_window │ ├── HelloWindow.cpp │ └── HelloWindow.h ├── 2.1hello_triangle │ ├── HelloTriangle.cpp │ ├── HelloTriangle.h │ ├── hello_triangle.frag │ ├── hello_triangle.vert │ └── hello_triangle1.frag ├── 2.2hello_triangle_indexed │ ├── HelloTriangleIndexed.cpp │ └── HelloTriangleIndexed.h ├── 2.3hello_triangle_exercise1 │ ├── HelloTriangleExercise1.cpp │ └── HelloTriangleExercise1.h ├── 2.4hello_triangle_exercise2 │ ├── HelloTriangleExercise2.cpp │ └── HelloTriangleExercise2.h ├── 2.5hello_triangle_exercise3 │ ├── HelloTriangleExercise3.cpp │ └── HelloTriangleExercise3.h ├── 3.2shaders_interpolation │ ├── ShadersInterpolation.cpp │ ├── ShadersInterpolation.h │ ├── shaders_interpolation.frag │ ├── shaders_interpolation.vert │ ├── shaders_interpolation1.frag │ └── shaders_interpolation1.vert ├── 4.1textures │ ├── Textures.cpp │ ├── Textures.h │ ├── textures.frag │ └── textures.vert ├── 4.4textures_exercise2 │ ├── TexturesExercise2.cpp │ ├── TexturesExercise2.h │ ├── textures_exercise2.frag │ └── textures_exercise2.vert ├── 4.5textures_exercise3 │ ├── TexturesExercise3.cpp │ └── TexturesExercise3.h ├── 4.6textures_exercise4 │ ├── TexturesExercise4.cpp │ ├── TexturesExercise4.h │ ├── textures_exercise4.frag │ └── textures_exercise4.vert ├── 5.1transformations │ ├── Transformations.cpp │ ├── Transformations.h │ ├── transformations.frag │ └── transformations.vert ├── 6.1coordinate_systems │ ├── CoordinateSystems.cpp │ ├── CoordinateSystems.frag │ ├── CoordinateSystems.h │ └── CoordinateSystems.vert ├── 6.2coordinate_systems_depth │ ├── CoordinateSystemsDepth.cpp │ ├── CoordinateSystemsDepth.frag │ ├── CoordinateSystemsDepth.h │ └── CoordinateSystemsDepth.vert ├── 6.3coordinate_systems_exercise │ ├── CoordinateSystemsExercise.cpp │ └── CoordinateSystemsExercise.h ├── 7.1camera_circle │ ├── CameraCircle.cpp │ └── CameraCircle.h ├── 7.2camera_interact │ ├── CameraInteract.cpp │ └── CameraInteract.h └── 7.4camera_class │ ├── CameraClass.cpp │ └── CameraClass.h ├── 2.lighting ├── 1.colors │ ├── Colors.cpp │ ├── Colors.h │ ├── colors.frag │ ├── colors.vert │ ├── light_cube.frag │ └── light_cube.vert ├── 2.1basic_lighting_diffuse │ ├── BasicLightingDiffuse.cpp │ ├── BasicLightingDiffuse.h │ ├── basic_lighting.frag │ └── basic_lighting.vert ├── 2.2basic_lighting_specular │ ├── BasicLightingSpecular.cpp │ ├── BasicLightingSpecular.h │ ├── basic_lighting.frag │ └── basic_lighting.vert ├── 2.3basic_lighting_exercise1 │ ├── BasicLightingExercise1.cpp │ └── BasicLightingExercise1.h ├── 2.5basic_lighting_exercise3 │ ├── BasicLightingExercise3.cpp │ ├── BasicLightingExercise3.h │ ├── basic_lighting.frag │ └── basic_lighting.vert ├── 3.1materials │ ├── Materials.cpp │ ├── Materials.h │ ├── materials.frag │ └── materials.vert ├── 4.1lighting_maps_diffuse_map │ ├── LightingMapsDiffuseMap.cpp │ ├── LightingMapsDiffuseMap.h │ ├── lighting_maps_diffuse_map.frag │ └── lighting_maps_diffuse_map.vert ├── 4.2lighting_maps_specular_map │ ├── LightingMapsSpecularMap.cpp │ ├── LightingMapsSpecularMap.h │ ├── lighting_maps_specular_map.frag │ └── lighting_maps_specular_map.vert ├── 4.3lighting_maps_exercise2 │ ├── LightingMapsExercise2.cpp │ ├── LightingMapsExercise2.h │ ├── lighting_maps_exercise2.frag │ └── lighting_maps_exercise2.vert ├── 4.4lighting_maps_exercise4 │ ├── LightingMapsExercise4.cpp │ ├── LightingMapsExercise4.h │ ├── lighting_maps_exercise4.frag │ └── lighting_maps_exercise4.vert ├── 5.1light_casters_directional │ ├── LightCastersDirectional.cpp │ ├── LightCastersDirectional.h │ ├── light_casters_directional.frag │ └── light_casters_directional.vert ├── 5.2light_casters_point │ ├── LightCastersPoint.cpp │ ├── LightCastersPoint.h │ ├── light_casters_point.frag │ └── light_casters_point.vert ├── 5.3light_casters_spot │ ├── LightCastersSpot.cpp │ ├── LightCastersSpot.h │ ├── light_casters_spot.frag │ └── light_casters_spot.vert └── 6.1multiple_lights │ ├── MultipleLights.cpp │ ├── MultipleLights.h │ ├── light_cube.frag │ ├── light_cube.vert │ ├── multiple_lights.frag │ └── multiple_lights.vert ├── 3.model_loading └── 1.model_loading │ ├── ModelLoading.cpp │ └── ModelLoading.h ├── 4.advanced_opengl ├── 1.1depth_testing │ ├── DepthTesting.cpp │ ├── DepthTesting.h │ ├── depth_testing.frag │ ├── depth_testing.vert │ └── depth_testing_view.frag ├── 10.1instancing_quads │ ├── InstancingQuads.cpp │ ├── InstancingQuads.h │ ├── instancing.frag │ └── instancing.vert ├── 10.2asteroids │ ├── Asteroids.cpp │ ├── Asteroids.h │ ├── asteroids.frag │ └── asteroids.vert ├── 10.3asteroids_instanced │ ├── AsteroidsInstanced.cpp │ ├── AsteroidsInstanced.h │ ├── asteroids.frag │ ├── asteroids.vert │ ├── planet.frag │ └── planet.vert ├── 2.stencil_testing │ ├── StencilTesting.cpp │ ├── StencilTesting.h │ ├── stencil_single_color.frag │ ├── stencil_testing.frag │ └── stencil_testing.vert ├── 3.1blending_discard │ ├── BlendingDiscard.cpp │ ├── BlendingDiscard.h │ ├── blending_discard.frag │ └── blending_discard.vert ├── 3.2blending_sort │ ├── BlendingSort.cpp │ ├── BlendingSort.h │ ├── blending_sort.frag │ └── blending_sort.vert ├── 4.face_culling_exercise1 │ ├── FaceCullingExercise1.cpp │ └── FaceCullingExercise1.h ├── 5.1framebuffers │ ├── Framebuffers.cpp │ ├── Framebuffers.h │ ├── framebuffers.frag │ ├── framebuffers.vert │ ├── framebuffers_screen.frag │ └── framebuffers_screen.vert ├── 5.2framebuffers_exercise1 │ ├── FramebuffersExercise1.cpp │ └── FramebuffersExercise1.h ├── 6.1cubemaps_skybox │ ├── CubemapsSkybox.cpp │ ├── CubemapsSkybox.h │ ├── cubemaps.frag │ ├── cubemaps.vert │ ├── skybox.frag │ └── skybox.vert ├── 6.2cubemaps_environment_mapping │ ├── CubemapsEnvironmentMapping.cpp │ ├── CubemapsEnvironmentMapping.h │ ├── cubemaps.frag │ └── cubemaps.vert ├── 8.advanced_glsl_ubo │ ├── AdvancedGlslUbo.cpp │ ├── AdvancedGlslUbo.h │ ├── advanced_glsl.vert │ ├── blue.frag │ ├── green.frag │ ├── red.frag │ └── yellow.frag ├── 9.1geometry_shader_houses │ ├── GeometryShaderHouses.cpp │ ├── GeometryShaderHouses.h │ ├── geometry_shader_houses.frag │ ├── geometry_shader_houses.geom │ └── geometry_shader_houses.vert ├── 9.2geometry_shader_exploding │ ├── GeometryShaderExploding.cpp │ ├── GeometryShaderExploding.h │ ├── geometry_shader_exploding.frag │ ├── geometry_shader_exploding.geom │ └── geometry_shader_exploding.vert └── 9.3geometry_shader_normals │ ├── GeometryShaderNormals.cpp │ ├── GeometryShaderNormals.h │ ├── default.frag │ ├── default.vert │ ├── normal_visualization.frag │ ├── normal_visualization.geom │ └── normal_visualization.vert ├── 5.advanced_lighting └── 1.advanced_lighting │ ├── AdvancedLighting.cpp │ ├── AdvancedLighting.h │ ├── advanced_lighting.frag │ └── advanced_lighting.vert ├── CMakeLists.txt ├── Config.h ├── MainWindow.cpp ├── MainWindow.h ├── main.cpp ├── shaders.qrc └── utils ├── CameraUtil.cpp ├── CameraUtil.h ├── CubemapTextureUtil.h ├── Mesh.cpp ├── Mesh.h ├── ModelUtil.cpp ├── ModelUtil.h ├── OpenGLUniformbufferObject.cpp ├── OpenGLUniformbufferObject.h └── ShaderUtil.h /.gitignore: -------------------------------------------------------------------------------- 1 | # user files 2 | assets/python38env/ 3 | pack/packages/root/data/ 4 | pack/packages/mysql/data/ 5 | 6 | # cmake files 7 | build/ 8 | ninja/ 9 | cmake-build-*/ 10 | Debug/ 11 | Release/ 12 | .xmake/ 13 | 14 | # ide files 15 | /.vs 16 | /.idea 17 | /.vscode 18 | /.cache 19 | CMakeSettings.json 20 | CMakePresets.json 21 | CMakeUserPresets.json 22 | .vim_localrc 23 | CMakeLists.txt.user 24 | CMakeLists.txt.user.* 25 | compile_commands.json 26 | 27 | # user files 28 | pack/packages/root/data/ 29 | pack/*.exe 30 | 31 | # qt 32 | *.pro.user 33 | -------------------------------------------------------------------------------- /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.15) 2 | 3 | # --- vcpkg 4 | if (DEFINED ENV{VCPKG_ROOT} AND NOT DEFINED CMAKE_TOOLCHAIN_FILE) 5 | message(STATUS "VCPKG_ROOT: $ENV{VCPKG_ROOT}") 6 | set(CMAKE_TOOLCHAIN_FILE "$ENV{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake" CACHE STRING "") 7 | endif() 8 | 9 | set(CMAKE_CXX_STANDARD 11) 10 | set(CMAKE_CXX_STANDARD_REQUIRED ON) 11 | 12 | # --- project 13 | project(learnopengl-qt 14 | LANGUAGES CXX C 15 | DESCRIPTION "qt version of https://learnopengl.com/" 16 | ) 17 | 18 | # --- build type 19 | if (NOT CMAKE_BUILD_TYPE) 20 | set(CMAKE_BUILD_TYPE Release) 21 | endif() 22 | 23 | message(STATUS "Build directory: ${PROJECT_BINARY_DIR}") 24 | message(STATUS "Build type: ${CMAKE_BUILD_TYPE}") 25 | 26 | # --- definitions 27 | if (WIN32) 28 | # get rid of 'min', 'max' macros; get back 'M_PI', 'M_E' 29 | add_definitions(-DNOMINMAX -D_USE_MATH_DEFINES) 30 | add_compile_options(/utf-8) 31 | #add_definitions(-DQT_NO_DEBUG_OUTPUT) 32 | endif() 33 | 34 | set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin) 35 | set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin) 36 | set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin) 37 | 38 | 39 | add_subdirectory(src) 40 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # learnopengl-qt 2 | 3 | learn opengl with Qt, and it's directory structure is mostly like the [origin one](https://github.com/JoeyDeVries/LearnOpenGL/tree/master/src). 4 | 5 | ## How to use 6 | 7 | ### install libraries 8 | 9 | * install [Qt](https://www.qt.io/download) 10 | * install [vcpkg](https://github.com/microsoft/vcpkg) 11 | * set `VCPKG_ROOT` environment variable to the vcpkg root dir 12 | * install assimp `vcpkg install assimp` 13 | 14 | ### run 15 | 16 | * open the file ```CMakeLists.txt``` with VS/VSCode/QtCreator or other IDEs, 17 | 18 | if you want to build in command line: 19 | ``` 20 | mkdir build 21 | cd build 22 | cmake .. 23 | cmake --build . --config Release 24 | ``` 25 | then all the things will be builded to `build/bin` 26 | 27 | * run it in debug/release mode 28 | * select a widget to show 29 | 30 | ![main window](./resources/readme/window.png) 31 | * for camera control, default key map is as follows, if you select a widget and find no cursor, just press `Q` to disable camera control 32 | 33 | | dir | key | 34 | | --- | --- | 35 | | forward | w | 36 | | backward | s | 37 | | left | a | 38 | | right | d | 39 | | disable | q | 40 | | enable | e | 41 | 42 | 43 | ## How to add a new widget 44 | 45 | * create a new class like this 46 | 47 | ```c++ 48 | class MultipleLights : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core 49 | { 50 | Q_OBJECT 51 | public: 52 | //Q_INVOKABLE is needed 53 | Q_INVOKABLE MultipleLights(QWidget *parent = nullptr); 54 | ~MultipleLights(); 55 | 56 | protected: 57 | virtual void initializeGL() override; 58 | virtual void resizeGL(int w, int h) override; 59 | virtual void paintGL() override; 60 | 61 | private: 62 | }; 63 | ``` 64 | 65 | * inclue it in ```MainWindow.h``` 66 | 67 | ```c++ 68 | #include "2.lighting/6.1multiple_lights/MultipleLights.h" 69 | ``` 70 | 71 | * add the class name and staticMetaObject to a hashMap in ```MainWindow.cpp``` 72 | 73 | ```c++ 74 | void MainWindow::registerMetaObject() 75 | { 76 | //add staticMetaObject of the new class you have created to a list 77 | m_metaObjectList << &MultipleLights::staticMetaObject; 78 | 79 | //then easily traverse the list and add QMetaObject to map and combox 80 | for(const QMetaObject* mo : m_metaObjectList){ 81 | m_metaObjectMap.insert(mo->className(), mo); 82 | m_combox->addItem(mo->className()); 83 | } 84 | } 85 | ``` 86 | 87 | ## Notes 88 | 89 | 1. ```glBindFramebuffer(GL_FRAMEBUFFER, 0)``` may not work in QOpenGLWidget, because 0 is not QOpenGLWidget's default framebuffer, use ```glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebufferObject())```instead. Here is my [blog](https://www.cnblogs.com/miyanyan/p/15131720.html) 90 | 91 | 2. It seems that Qt does not have UBO(uniform buffer object), thus I made a class called ```OpenGLUniformbufferObject```. And, you must pay attention: 92 | 93 | ```c++ 94 | // wrong 95 | class OpenGLUniformbufferObject : public QOpenGLFunctions_3_3_Core 96 | { 97 | //... 98 | glGetActiveUniformBlockiv(m_shaderId, m_uniformBlockIndex, GL_UNIFORM_BLOCK_DATA_SIZE, &m_uboSize); 99 | } 100 | // right 101 | class OpenGLUniformbufferObject 102 | { 103 | //... 104 | // get current opengl function 105 | QOpenGLFunctions_3_3_Core* m_glFunc = QOpenGLContext::currentContext()->versionFunctions(); 106 | m_glFunc->glGetActiveUniformBlockiv(m_shaderId, m_uniformBlockIndex, GL_UNIFORM_BLOCK_DATA_SIZE, &m_uboSize); 107 | } 108 | 109 | ``` 110 | 111 | 3. [learnopengl Model-Loading](https://learnopengl.com/Model-Loading/Model) does not support 3D formats with embedded textures, 112 | so don't use .glb .gltf or other formats. 113 | -------------------------------------------------------------------------------- /resources/objects/nanosuit/LICENSE.txt: -------------------------------------------------------------------------------- 1 | Original Nanosuit model by ForrestPL: 2 | http://tf3dm.com/3d-model/crysis-2-nanosuit-2-97837.html 3 | 4 | Slightly modified for use in the LearnOpenGL.com tutorials (by Joey de Vries) 5 | 6 | For personal use only -------------------------------------------------------------------------------- /resources/objects/nanosuit/arm_dif.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/miyanyan/learnopengl-qt/8f9262cebc78d06a931307926561fc7ab2b24da4/resources/objects/nanosuit/arm_dif.png -------------------------------------------------------------------------------- /resources/objects/nanosuit/arm_showroom_ddn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/miyanyan/learnopengl-qt/8f9262cebc78d06a931307926561fc7ab2b24da4/resources/objects/nanosuit/arm_showroom_ddn.png -------------------------------------------------------------------------------- /resources/objects/nanosuit/arm_showroom_spec.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/miyanyan/learnopengl-qt/8f9262cebc78d06a931307926561fc7ab2b24da4/resources/objects/nanosuit/arm_showroom_spec.png -------------------------------------------------------------------------------- /resources/objects/nanosuit/body_dif.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/miyanyan/learnopengl-qt/8f9262cebc78d06a931307926561fc7ab2b24da4/resources/objects/nanosuit/body_dif.png -------------------------------------------------------------------------------- /resources/objects/nanosuit/body_showroom_ddn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/miyanyan/learnopengl-qt/8f9262cebc78d06a931307926561fc7ab2b24da4/resources/objects/nanosuit/body_showroom_ddn.png -------------------------------------------------------------------------------- /resources/objects/nanosuit/body_showroom_spec.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/miyanyan/learnopengl-qt/8f9262cebc78d06a931307926561fc7ab2b24da4/resources/objects/nanosuit/body_showroom_spec.png -------------------------------------------------------------------------------- /resources/objects/nanosuit/glass_ddn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/miyanyan/learnopengl-qt/8f9262cebc78d06a931307926561fc7ab2b24da4/resources/objects/nanosuit/glass_ddn.png -------------------------------------------------------------------------------- /resources/objects/nanosuit/glass_dif.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/miyanyan/learnopengl-qt/8f9262cebc78d06a931307926561fc7ab2b24da4/resources/objects/nanosuit/glass_dif.png -------------------------------------------------------------------------------- /resources/objects/nanosuit/hand_dif.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/miyanyan/learnopengl-qt/8f9262cebc78d06a931307926561fc7ab2b24da4/resources/objects/nanosuit/hand_dif.png -------------------------------------------------------------------------------- /resources/objects/nanosuit/hand_showroom_ddn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/miyanyan/learnopengl-qt/8f9262cebc78d06a931307926561fc7ab2b24da4/resources/objects/nanosuit/hand_showroom_ddn.png -------------------------------------------------------------------------------- /resources/objects/nanosuit/hand_showroom_spec.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/miyanyan/learnopengl-qt/8f9262cebc78d06a931307926561fc7ab2b24da4/resources/objects/nanosuit/hand_showroom_spec.png -------------------------------------------------------------------------------- /resources/objects/nanosuit/helmet_diff.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/miyanyan/learnopengl-qt/8f9262cebc78d06a931307926561fc7ab2b24da4/resources/objects/nanosuit/helmet_diff.png -------------------------------------------------------------------------------- /resources/objects/nanosuit/helmet_showroom_ddn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/miyanyan/learnopengl-qt/8f9262cebc78d06a931307926561fc7ab2b24da4/resources/objects/nanosuit/helmet_showroom_ddn.png -------------------------------------------------------------------------------- /resources/objects/nanosuit/helmet_showroom_spec.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/miyanyan/learnopengl-qt/8f9262cebc78d06a931307926561fc7ab2b24da4/resources/objects/nanosuit/helmet_showroom_spec.png -------------------------------------------------------------------------------- /resources/objects/nanosuit/leg_dif.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/miyanyan/learnopengl-qt/8f9262cebc78d06a931307926561fc7ab2b24da4/resources/objects/nanosuit/leg_dif.png -------------------------------------------------------------------------------- /resources/objects/nanosuit/leg_showroom_ddn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/miyanyan/learnopengl-qt/8f9262cebc78d06a931307926561fc7ab2b24da4/resources/objects/nanosuit/leg_showroom_ddn.png -------------------------------------------------------------------------------- /resources/objects/nanosuit/leg_showroom_spec.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/miyanyan/learnopengl-qt/8f9262cebc78d06a931307926561fc7ab2b24da4/resources/objects/nanosuit/leg_showroom_spec.png -------------------------------------------------------------------------------- /resources/objects/nanosuit/nanosuit.blend: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/miyanyan/learnopengl-qt/8f9262cebc78d06a931307926561fc7ab2b24da4/resources/objects/nanosuit/nanosuit.blend -------------------------------------------------------------------------------- /resources/objects/nanosuit/nanosuit.mtl: -------------------------------------------------------------------------------- 1 | # Blender MTL File: 'nanosuit.blend' 2 | # Material Count: 6 3 | newmtl Arm 4 | Ns 96.078431 5 | Ka 0.000000 0.000000 0.000000 6 | Kd 0.640000 0.640000 0.640000 7 | Ks 0.500000 0.500000 0.500000 8 | Ni 1.000000 9 | d 1.000000 10 | illum 2 11 | map_Kd arm_dif.png 12 | map_Bump arm_showroom_ddn.png 13 | map_Ks arm_showroom_spec.png 14 | 15 | 16 | newmtl Body 17 | Ns 96.078431 18 | Ka 0.000000 0.000000 0.000000 19 | Kd 0.640000 0.640000 0.640000 20 | Ks 0.500000 0.500000 0.500000 21 | Ni 1.000000 22 | d 1.000000 23 | illum 2 24 | map_Kd body_dif.png 25 | map_Bump body_showroom_ddn.png 26 | map_Ks body_showroom_spec.png 27 | 28 | 29 | newmtl Glass 30 | Ns 96.078431 31 | Ka 0.000000 0.000000 0.000000 32 | Kd 0.640000 0.640000 0.640000 33 | Ks 0.500000 0.500000 0.500000 34 | Ni 1.000000 35 | d 1.000000 36 | illum 2 37 | map_Kd glass_dif.png 38 | map_Bump glass_ddn.png 39 | 40 | 41 | newmtl Hand 42 | Ns 96.078431 43 | Ka 0.000000 0.000000 0.000000 44 | Kd 0.640000 0.640000 0.640000 45 | Ks 0.500000 0.500000 0.500000 46 | Ni 1.000000 47 | d 1.000000 48 | illum 2 49 | map_Kd hand_dif.png 50 | map_Bump hand_showroom_ddn.png 51 | map_Ks hand_showroom_spec.png 52 | 53 | 54 | newmtl Helmet 55 | Ns 96.078431 56 | Ka 0.000000 0.000000 0.000000 57 | Kd 0.640000 0.640000 0.640000 58 | Ks 0.500000 0.500000 0.500000 59 | Ni 1.000000 60 | d 1.000000 61 | illum 2 62 | map_Kd helmet_diff.png 63 | map_Bump helmet_showroom_ddn.png 64 | map_Ks helmet_showroom_spec.png 65 | 66 | 67 | newmtl Leg 68 | Ns 96.078431 69 | Ka 0.000000 0.000000 0.000000 70 | Kd 0.640000 0.640000 0.640000 71 | Ks 0.500000 0.500000 0.500000 72 | Ni 1.000000 73 | d 1.000000 74 | illum 2 75 | map_Kd leg_dif.png 76 | map_Bump leg_showroom_ddn.png 77 | map_Ks leg_showroom_spec.png 78 | 79 | 80 | -------------------------------------------------------------------------------- /resources/objects/planet/planet.mtl: -------------------------------------------------------------------------------- 1 | # Blender MTL 2 | # Material Count: 1 3 | 4 | newmtl Material.001 5 | Ns 96.078431 6 | Ka 0.000000 0.000000 0.000000 7 | Kd 0.640000 0.640000 0.640000 8 | Ks 0.087302 0.087302 0.087302 9 | Ni 1.000000 10 | d 1.000000 11 | illum 2 12 | map_Kd planet_Quom1200.png 13 | map_Bump planet_Quom1200.png 14 | -------------------------------------------------------------------------------- /resources/objects/planet/planet_Quom1200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/miyanyan/learnopengl-qt/8f9262cebc78d06a931307926561fc7ab2b24da4/resources/objects/planet/planet_Quom1200.png -------------------------------------------------------------------------------- /resources/objects/rock/Rock-Texture-Surface.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/miyanyan/learnopengl-qt/8f9262cebc78d06a931307926561fc7ab2b24da4/resources/objects/rock/Rock-Texture-Surface.jpg -------------------------------------------------------------------------------- /resources/objects/rock/rock.mtl: -------------------------------------------------------------------------------- 1 | # Blender MTL File: 'Rock1.blend' 2 | # Material Count: 1 3 | 4 | newmtl Material 5 | Ns 13.725490 6 | Ka 0.000000 0.000000 0.000000 7 | Kd 0.640000 0.640000 0.640000 8 | Ks 0.007937 0.007937 0.007937 9 | Ni 1.000000 10 | d 1.000000 11 | illum 2 12 | map_Bump Rock-Texture-Surface.jpg 13 | map_Kd Rock-Texture-Surface.jpg 14 | -------------------------------------------------------------------------------- /resources/readme/window.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/miyanyan/learnopengl-qt/8f9262cebc78d06a931307926561fc7ab2b24da4/resources/readme/window.png -------------------------------------------------------------------------------- /resources/resources.qrc: -------------------------------------------------------------------------------- 1 | 2 | 3 | textures/awesomeface.png 4 | textures/container.jpg 5 | textures/container2.png 6 | textures/container2_specular.png 7 | textures/grass.png 8 | textures/marble.jpg 9 | textures/matrix.jpg 10 | textures/metal.png 11 | textures/window.png 12 | textures/wood.png 13 | objects/nanosuit/nanosuit.obj 14 | textures/skybox/back.jpg 15 | textures/skybox/bottom.jpg 16 | textures/skybox/front.jpg 17 | textures/skybox/left.jpg 18 | textures/skybox/right.jpg 19 | textures/skybox/top.jpg 20 | 21 | 22 | -------------------------------------------------------------------------------- /resources/textures/awesomeface.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/miyanyan/learnopengl-qt/8f9262cebc78d06a931307926561fc7ab2b24da4/resources/textures/awesomeface.png -------------------------------------------------------------------------------- /resources/textures/container.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/miyanyan/learnopengl-qt/8f9262cebc78d06a931307926561fc7ab2b24da4/resources/textures/container.jpg -------------------------------------------------------------------------------- /resources/textures/container2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/miyanyan/learnopengl-qt/8f9262cebc78d06a931307926561fc7ab2b24da4/resources/textures/container2.png -------------------------------------------------------------------------------- /resources/textures/container2_specular.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/miyanyan/learnopengl-qt/8f9262cebc78d06a931307926561fc7ab2b24da4/resources/textures/container2_specular.png -------------------------------------------------------------------------------- /resources/textures/grass.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/miyanyan/learnopengl-qt/8f9262cebc78d06a931307926561fc7ab2b24da4/resources/textures/grass.png -------------------------------------------------------------------------------- /resources/textures/marble.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/miyanyan/learnopengl-qt/8f9262cebc78d06a931307926561fc7ab2b24da4/resources/textures/marble.jpg -------------------------------------------------------------------------------- /resources/textures/matrix.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/miyanyan/learnopengl-qt/8f9262cebc78d06a931307926561fc7ab2b24da4/resources/textures/matrix.jpg -------------------------------------------------------------------------------- /resources/textures/metal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/miyanyan/learnopengl-qt/8f9262cebc78d06a931307926561fc7ab2b24da4/resources/textures/metal.png -------------------------------------------------------------------------------- /resources/textures/skybox/back.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/miyanyan/learnopengl-qt/8f9262cebc78d06a931307926561fc7ab2b24da4/resources/textures/skybox/back.jpg -------------------------------------------------------------------------------- /resources/textures/skybox/bottom.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/miyanyan/learnopengl-qt/8f9262cebc78d06a931307926561fc7ab2b24da4/resources/textures/skybox/bottom.jpg -------------------------------------------------------------------------------- /resources/textures/skybox/front.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/miyanyan/learnopengl-qt/8f9262cebc78d06a931307926561fc7ab2b24da4/resources/textures/skybox/front.jpg -------------------------------------------------------------------------------- /resources/textures/skybox/left.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/miyanyan/learnopengl-qt/8f9262cebc78d06a931307926561fc7ab2b24da4/resources/textures/skybox/left.jpg -------------------------------------------------------------------------------- /resources/textures/skybox/right.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/miyanyan/learnopengl-qt/8f9262cebc78d06a931307926561fc7ab2b24da4/resources/textures/skybox/right.jpg -------------------------------------------------------------------------------- /resources/textures/skybox/top.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/miyanyan/learnopengl-qt/8f9262cebc78d06a931307926561fc7ab2b24da4/resources/textures/skybox/top.jpg -------------------------------------------------------------------------------- /resources/textures/window.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/miyanyan/learnopengl-qt/8f9262cebc78d06a931307926561fc7ab2b24da4/resources/textures/window.png -------------------------------------------------------------------------------- /resources/textures/wood.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/miyanyan/learnopengl-qt/8f9262cebc78d06a931307926561fc7ab2b24da4/resources/textures/wood.png -------------------------------------------------------------------------------- /src/1.getting_started/1.1hello_window/HelloWindow.cpp: -------------------------------------------------------------------------------- 1 | #include "HelloWindow.h" 2 | 3 | #include 4 | 5 | HelloWindow::HelloWindow(QWidget *parent) : QOpenGLWidget(parent) 6 | { 7 | 8 | } 9 | 10 | void HelloWindow::initializeGL() 11 | { 12 | if(!context()){ 13 | qCritical() << "Cant't get OpenGL contex"; 14 | close(); 15 | return; 16 | } 17 | initializeOpenGLFunctions(); 18 | qInfo() << "real OpenGL version " << reinterpret_cast(glGetString(GL_VERSION)); 19 | } 20 | 21 | void HelloWindow::resizeGL(int w, int h) 22 | { 23 | glViewport(0, 0, w, h); 24 | } 25 | 26 | void HelloWindow::paintGL() 27 | { 28 | glClearColor(0.2f, 0.3f, 0.3f, 1.0f); 29 | glClear(GL_COLOR_BUFFER_BIT); 30 | } 31 | -------------------------------------------------------------------------------- /src/1.getting_started/1.1hello_window/HelloWindow.h: -------------------------------------------------------------------------------- 1 | #ifndef HELLOWINDOW_H 2 | #define HELLOWINDOW_H 3 | 4 | #include 5 | #include 6 | #include 7 | 8 | class HelloWindow : public QOpenGLWidget, protected QOpenGLFunctions 9 | { 10 | Q_OBJECT 11 | public: 12 | Q_INVOKABLE HelloWindow(QWidget *parent = nullptr); 13 | 14 | protected: 15 | void initializeGL() override; 16 | void resizeGL(int w, int h) override; 17 | void paintGL() override; 18 | }; 19 | 20 | #endif // HELLOWINDOW_H 21 | -------------------------------------------------------------------------------- /src/1.getting_started/2.1hello_triangle/HelloTriangle.cpp: -------------------------------------------------------------------------------- 1 | #include "HelloTriangle.h" 2 | 3 | #include 4 | 5 | HelloTriangle::HelloTriangle(QWidget *parent) 6 | : QOpenGLWidget(parent), 7 | m_VBO(QOpenGLBuffer::VertexBuffer) 8 | { 9 | 10 | } 11 | 12 | HelloTriangle::~HelloTriangle() 13 | { 14 | makeCurrent(); 15 | 16 | m_VBO.destroy(); 17 | m_VAO.destroy(); 18 | 19 | doneCurrent(); 20 | } 21 | 22 | void HelloTriangle::initializeGL() 23 | { 24 | if(!context()){ 25 | qCritical() << "Cant't get OpenGL contex"; 26 | close(); 27 | return; 28 | } 29 | initializeOpenGLFunctions(); 30 | //shader初始化 31 | { 32 | bool result = true; 33 | result = m_program.addShaderFromSourceFile(QOpenGLShader::Vertex, ":/1.getting_started/2.1hello_triangle/hello_triangle.vert"); 34 | if(!result){ 35 | qDebug() << m_program.log(); 36 | } 37 | result = m_program.addShaderFromSourceFile(QOpenGLShader::Fragment, ":/1.getting_started/2.1hello_triangle/hello_triangle.frag"); 38 | if(!result){ 39 | qDebug() << m_program.log(); 40 | } 41 | result = m_program.link(); 42 | if(!result){ 43 | qDebug() << m_program.log(); 44 | } 45 | } 46 | // 47 | { 48 | //2D triangle 49 | GLfloat vertices[] = { 50 | -0.5f, -0.5f, 0.0f, //left 51 | 0.5f, -0.5f, 0.0f, //right 52 | 0.0f, 0.5f, 0.0f //top 53 | }; 54 | //1. 绑定顶点数组对象 55 | m_VAO.create(); 56 | QOpenGLVertexArrayObject::Binder vaoBinder(&m_VAO); 57 | //2. 把顶点数组复制到缓冲中供OpenGL使用 58 | m_VBO.create(); 59 | m_VBO.bind(); 60 | //将顶点数据分配到VBO中,第一个参数为数据指针,第二个参数为数据的字节长度 61 | m_VBO.allocate(vertices, sizeof(vertices)); 62 | //3. 设置顶点属性指针 63 | m_program.setAttributeBuffer(0, GL_FLOAT, 0, 3, sizeof(GLfloat) * 3); 64 | m_program.enableAttributeArray(0); 65 | } 66 | } 67 | 68 | void HelloTriangle::resizeGL(int w, int h) 69 | { 70 | glViewport(0, 0, w, h); 71 | } 72 | 73 | void HelloTriangle::paintGL() 74 | { 75 | glClearColor(0.2f, 0.3f, 0.3f, 1.0f); 76 | glClear(GL_COLOR_BUFFER_BIT); 77 | 78 | m_program.bind(); 79 | QOpenGLVertexArrayObject::Binder vaoBinder(&m_VAO); 80 | glDrawArrays(GL_TRIANGLES, 0, 3); 81 | m_program.release(); 82 | } 83 | 84 | -------------------------------------------------------------------------------- /src/1.getting_started/2.1hello_triangle/HelloTriangle.h: -------------------------------------------------------------------------------- 1 | #ifndef HELLOTRIANGLE_H 2 | #define HELLOTRIANGLE_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | 10 | class HelloTriangle : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core 11 | { 12 | Q_OBJECT 13 | public: 14 | Q_INVOKABLE HelloTriangle(QWidget *parent = nullptr); 15 | ~HelloTriangle(); 16 | protected: 17 | virtual void initializeGL() override; 18 | virtual void resizeGL(int w, int h) override; 19 | virtual void paintGL() override; 20 | 21 | private: 22 | QOpenGLVertexArrayObject m_VAO; 23 | QOpenGLBuffer m_VBO; 24 | 25 | QOpenGLShaderProgram m_program; 26 | }; 27 | 28 | #endif // HELLOTRIANGLE_H 29 | -------------------------------------------------------------------------------- /src/1.getting_started/2.1hello_triangle/hello_triangle.frag: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | out vec4 color; 3 | 4 | void main(void) 5 | { 6 | color = vec4(1.0f, 0.5f, 0.2f, 1.0f); 7 | } 8 | -------------------------------------------------------------------------------- /src/1.getting_started/2.1hello_triangle/hello_triangle.vert: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | layout (location = 0) in vec3 position; 3 | 4 | void main(void) 5 | { 6 | gl_Position = vec4(position, 1.0); 7 | } 8 | -------------------------------------------------------------------------------- /src/1.getting_started/2.1hello_triangle/hello_triangle1.frag: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | out vec4 color; 3 | 4 | void main(void) 5 | { 6 | color = vec4(1.0f, 1.0f, 0.2f, 1.0f); 7 | } 8 | -------------------------------------------------------------------------------- /src/1.getting_started/2.2hello_triangle_indexed/HelloTriangleIndexed.cpp: -------------------------------------------------------------------------------- 1 | #include "HelloTriangleIndexed.h" 2 | 3 | #include 4 | 5 | HelloTriangleIndexed::HelloTriangleIndexed(QWidget *parent) 6 | : QOpenGLWidget(parent), 7 | m_VBO(QOpenGLBuffer::VertexBuffer), 8 | m_IBO(QOpenGLBuffer::IndexBuffer) 9 | { 10 | 11 | } 12 | 13 | HelloTriangleIndexed::~HelloTriangleIndexed() 14 | { 15 | makeCurrent(); 16 | 17 | m_IBO.destroy(); 18 | m_VBO.destroy(); 19 | m_VAO.destroy(); 20 | 21 | doneCurrent(); 22 | } 23 | 24 | void HelloTriangleIndexed::initializeGL() 25 | { 26 | if(!context()){ 27 | qCritical() << "Cant't get OpenGL contex"; 28 | close(); 29 | return; 30 | } 31 | initializeOpenGLFunctions(); 32 | 33 | glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); 34 | 35 | //shader初始化 36 | { 37 | bool result = true; 38 | result = m_program.addShaderFromSourceFile(QOpenGLShader::Vertex, ":/1.getting_started/2.1hello_triangle/hello_triangle.vert"); 39 | if(!result){ 40 | qDebug() << m_program.log(); 41 | } 42 | result = m_program.addShaderFromSourceFile(QOpenGLShader::Fragment, ":/1.getting_started/2.1hello_triangle/hello_triangle.frag"); 43 | if(!result){ 44 | qDebug() << m_program.log(); 45 | } 46 | result = m_program.link(); 47 | if(!result){ 48 | qDebug() << m_program.log(); 49 | } 50 | } 51 | // 52 | { 53 | //2D triangle 54 | GLfloat vertices[] = { 55 | 0.5f, 0.5f, 0.0f, // 右上角 56 | 0.5f, -0.5f, 0.0f, // 右下角 57 | -0.5f, -0.5f, 0.0f, // 左下角 58 | -0.5f, 0.5f, 0.0f // 左上角 59 | }; 60 | unsigned int indices[] = { // 注意索引从0开始! 61 | 0, 1, 3, // 第一个三角形 62 | 1, 2, 3 // 第二个三角形 63 | }; 64 | //1. 绑定顶点数组对象 65 | m_VAO.create(); 66 | QOpenGLVertexArrayObject::Binder vaoBinder(&m_VAO); 67 | //2. 把顶点数组复制到缓冲中供OpenGL使用 68 | m_VBO.create(); 69 | m_VBO.bind(); 70 | m_VBO.allocate(vertices, sizeof(vertices)); 71 | //3. 复制我们的索引数组到一个索引缓冲中,供OpenGL使用 72 | m_IBO.create(); 73 | m_IBO.bind(); 74 | m_IBO.allocate(indices, sizeof(indices)); 75 | //4. 设置顶点属性指针 76 | m_program.setAttributeBuffer(0, GL_FLOAT, 0, 3, sizeof(GLfloat) * 3); 77 | m_program.enableAttributeArray(0); 78 | } 79 | } 80 | 81 | void HelloTriangleIndexed::resizeGL(int w, int h) 82 | { 83 | glViewport(0, 0, w, h); 84 | } 85 | 86 | void HelloTriangleIndexed::paintGL() 87 | { 88 | glClearColor(0.2f, 0.3f, 0.3f, 1.0f); 89 | glClear(GL_COLOR_BUFFER_BIT); 90 | 91 | m_program.bind(); 92 | QOpenGLVertexArrayObject::Binder vaoBinder(&m_VAO); 93 | glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); 94 | m_program.release(); 95 | } 96 | 97 | -------------------------------------------------------------------------------- /src/1.getting_started/2.2hello_triangle_indexed/HelloTriangleIndexed.h: -------------------------------------------------------------------------------- 1 | #ifndef HELLOTRIANGLEINDEXED_H 2 | #define HELLOTRIANGLEINDEXED_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | 10 | class HelloTriangleIndexed : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core 11 | { 12 | Q_OBJECT 13 | public: 14 | Q_INVOKABLE HelloTriangleIndexed(QWidget *parent = nullptr); 15 | ~HelloTriangleIndexed(); 16 | protected: 17 | virtual void initializeGL() override; 18 | virtual void resizeGL(int w, int h) override; 19 | virtual void paintGL() override; 20 | 21 | private: 22 | QOpenGLVertexArrayObject m_VAO; 23 | QOpenGLBuffer m_VBO; 24 | QOpenGLBuffer m_IBO; 25 | 26 | QOpenGLShaderProgram m_program; 27 | }; 28 | 29 | #endif // HELLOTRIANGLEINDEXED_H 30 | -------------------------------------------------------------------------------- /src/1.getting_started/2.3hello_triangle_exercise1/HelloTriangleExercise1.cpp: -------------------------------------------------------------------------------- 1 | #include "HelloTriangleExercise1.h" 2 | 3 | #include 4 | 5 | HelloTriangleExercise1::HelloTriangleExercise1(QWidget *parent) 6 | : QOpenGLWidget(parent), 7 | m_VBO(QOpenGLBuffer::VertexBuffer), 8 | m_IBO(QOpenGLBuffer::IndexBuffer) 9 | { 10 | 11 | } 12 | 13 | HelloTriangleExercise1::~HelloTriangleExercise1() 14 | { 15 | makeCurrent(); 16 | 17 | m_IBO.destroy(); 18 | m_VBO.destroy(); 19 | m_VAO.destroy(); 20 | 21 | doneCurrent(); 22 | } 23 | 24 | void HelloTriangleExercise1::initializeGL() 25 | { 26 | if(!context()){ 27 | qCritical() << "Cant't get OpenGL contex"; 28 | close(); 29 | return; 30 | } 31 | initializeOpenGLFunctions(); 32 | 33 | glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); 34 | 35 | //shader初始化 36 | { 37 | bool result = true; 38 | result = m_program.addShaderFromSourceFile(QOpenGLShader::Vertex, ":/1.getting_started/2.1hello_triangle/hello_triangle.vert"); 39 | if(!result){ 40 | qDebug() << m_program.log(); 41 | } 42 | result = m_program.addShaderFromSourceFile(QOpenGLShader::Fragment, ":/1.getting_started/2.1hello_triangle/hello_triangle.frag"); 43 | if(!result){ 44 | qDebug() << m_program.log(); 45 | } 46 | result = m_program.link(); 47 | if(!result){ 48 | qDebug() << m_program.log(); 49 | } 50 | } 51 | // 52 | { 53 | //2D triangle 54 | GLfloat vertices[] = { 55 | -0.9f, -0.5f, 0.0f, // left 56 | -0.0f, -0.5f, 0.0f, // right 57 | -0.45f, 0.5f, 0.0f, // top 58 | // second triangle 59 | 0.9f, -0.5f, 0.0f, // right 60 | 0.45f, 0.5f, 0.0f // top 61 | }; 62 | unsigned int indices[] = { // 注意索引从0开始! 63 | 0, 1, 2, // 第一个三角形 64 | 1, 3, 4 // 第二个三角形 65 | }; 66 | //1. 绑定顶点数组对象 67 | m_VAO.create(); 68 | QOpenGLVertexArrayObject::Binder vaoBinder(&m_VAO); 69 | //2. 把顶点数组复制到缓冲中供OpenGL使用 70 | m_VBO.create(); 71 | m_VBO.bind(); 72 | m_VBO.allocate(vertices, sizeof(vertices)); 73 | //3. 复制我们的索引数组到一个索引缓冲中,供OpenGL使用 74 | m_IBO.create(); 75 | m_IBO.bind(); 76 | m_IBO.allocate(indices, sizeof(indices)); 77 | //4. 设置顶点属性指针 78 | m_program.setAttributeBuffer(0, GL_FLOAT, 0, 3, sizeof(GLfloat) * 3); 79 | m_program.enableAttributeArray(0); 80 | } 81 | } 82 | 83 | void HelloTriangleExercise1::resizeGL(int w, int h) 84 | { 85 | glViewport(0, 0, w, h); 86 | } 87 | 88 | void HelloTriangleExercise1::paintGL() 89 | { 90 | glClearColor(0.2f, 0.3f, 0.3f, 1.0f); 91 | glClear(GL_COLOR_BUFFER_BIT); 92 | 93 | m_program.bind(); 94 | QOpenGLVertexArrayObject::Binder vaoBinder(&m_VAO); 95 | glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); 96 | m_program.release(); 97 | } 98 | 99 | -------------------------------------------------------------------------------- /src/1.getting_started/2.3hello_triangle_exercise1/HelloTriangleExercise1.h: -------------------------------------------------------------------------------- 1 | #ifndef HELLOTRIANGLEEXERCISE1_H 2 | #define HELLOTRIANGLEEXERCISE1_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | 10 | class HelloTriangleExercise1 : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core 11 | { 12 | Q_OBJECT 13 | public: 14 | Q_INVOKABLE HelloTriangleExercise1(QWidget *parent = nullptr); 15 | ~HelloTriangleExercise1(); 16 | 17 | protected: 18 | virtual void initializeGL() override; 19 | virtual void resizeGL(int w, int h) override; 20 | virtual void paintGL() override; 21 | 22 | private: 23 | QOpenGLVertexArrayObject m_VAO; 24 | QOpenGLBuffer m_VBO; 25 | QOpenGLBuffer m_IBO; 26 | 27 | QOpenGLShaderProgram m_program; 28 | }; 29 | 30 | #endif // HELLOTRIANGLEEXERCISE1_H 31 | -------------------------------------------------------------------------------- /src/1.getting_started/2.4hello_triangle_exercise2/HelloTriangleExercise2.cpp: -------------------------------------------------------------------------------- 1 | #include "HelloTriangleExercise2.h" 2 | 3 | #include 4 | 5 | HelloTriangleExercise2::HelloTriangleExercise2(QWidget *parent) 6 | : QOpenGLWidget(parent) 7 | { 8 | 9 | } 10 | 11 | HelloTriangleExercise2::~HelloTriangleExercise2() 12 | { 13 | makeCurrent(); 14 | 15 | m_VBO[0].destroy(); 16 | m_VBO[1].destroy(); 17 | m_VAO[0].destroy(); 18 | m_VAO[1].destroy(); 19 | 20 | doneCurrent(); 21 | } 22 | 23 | void HelloTriangleExercise2::initializeGL() 24 | { 25 | if(!context()){ 26 | qCritical() << "Cant't get OpenGL contex"; 27 | close(); 28 | return; 29 | } 30 | initializeOpenGLFunctions(); 31 | 32 | //shader初始化 33 | { 34 | bool result = true; 35 | result = m_program.addShaderFromSourceFile(QOpenGLShader::Vertex, ":/1.getting_started/2.1hello_triangle/hello_triangle.vert"); 36 | if(!result){ 37 | qDebug() << m_program.log(); 38 | } 39 | result = m_program.addShaderFromSourceFile(QOpenGLShader::Fragment, ":/1.getting_started/2.1hello_triangle/hello_triangle.frag"); 40 | if(!result){ 41 | qDebug() << m_program.log(); 42 | } 43 | result = m_program.link(); 44 | if(!result){ 45 | qDebug() << m_program.log(); 46 | } 47 | } 48 | // 49 | { 50 | //2D triangle 51 | float vertices[2][9] = { 52 | { 53 | -0.9f, -0.5f, 0.0f, // left 54 | -0.0f, -0.5f, 0.0f, // right 55 | -0.9f, 0.5f, 0.0f, // top 56 | }, 57 | { 58 | 0.0f, -0.5f, 0.0f, // left 59 | 0.9f, -0.5f, 0.0f, // right 60 | 0.9f, 0.5f, 0.0f // top 61 | } 62 | }; 63 | 64 | for(int i = 0; i < 2; ++i){ 65 | //1. 绑定顶点数组对象 66 | m_VAO[i].create(); 67 | QOpenGLVertexArrayObject::Binder vaoBinder(&m_VAO[i]); 68 | //2. 把顶点数组复制到缓冲中供OpenGL使用 69 | m_VBO[i].create(); 70 | m_VBO[i].bind(); 71 | m_VBO[i].allocate(vertices[i], sizeof(vertices[i])); 72 | //3. 设置顶点属性指针 73 | m_program.setAttributeBuffer(0, GL_FLOAT, 0, 3, sizeof(GLfloat) * 3); 74 | m_program.enableAttributeArray(0); 75 | } 76 | } 77 | } 78 | 79 | void HelloTriangleExercise2::resizeGL(int w, int h) 80 | { 81 | glViewport(0, 0, w, h); 82 | } 83 | 84 | void HelloTriangleExercise2::paintGL() 85 | { 86 | glClearColor(0.2f, 0.3f, 0.3f, 1.0f); 87 | glClear(GL_COLOR_BUFFER_BIT); 88 | 89 | m_program.bind(); 90 | QOpenGLVertexArrayObject::Binder vaoBinder0(&m_VAO[0]); 91 | glDrawArrays(GL_TRIANGLES, 0, 3); 92 | QOpenGLVertexArrayObject::Binder vaoBinder1(&m_VAO[1]); 93 | glDrawArrays(GL_TRIANGLES, 0, 3); 94 | m_program.release(); 95 | } 96 | 97 | -------------------------------------------------------------------------------- /src/1.getting_started/2.4hello_triangle_exercise2/HelloTriangleExercise2.h: -------------------------------------------------------------------------------- 1 | #ifndef HELLOTRIANGLEEXERCISE2_H 2 | #define HELLOTRIANGLEEXERCISE2_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | 10 | class HelloTriangleExercise2 : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core 11 | { 12 | Q_OBJECT 13 | public: 14 | Q_INVOKABLE HelloTriangleExercise2(QWidget *parent = nullptr); 15 | ~HelloTriangleExercise2(); 16 | 17 | protected: 18 | virtual void initializeGL() override; 19 | virtual void resizeGL(int w, int h) override; 20 | virtual void paintGL() override; 21 | 22 | private: 23 | QOpenGLVertexArrayObject m_VAO[2]; 24 | QOpenGLBuffer m_VBO[2]; 25 | 26 | QOpenGLShaderProgram m_program; 27 | }; 28 | 29 | #endif // HELLOTRIANGLEEXERCISE2_H 30 | -------------------------------------------------------------------------------- /src/1.getting_started/2.5hello_triangle_exercise3/HelloTriangleExercise3.cpp: -------------------------------------------------------------------------------- 1 | #include "HelloTriangleExercise3.h" 2 | 3 | #include 4 | 5 | HelloTriangleExercise3::HelloTriangleExercise3(QWidget *parent) 6 | : QOpenGLWidget(parent) 7 | { 8 | 9 | } 10 | 11 | HelloTriangleExercise3::~HelloTriangleExercise3() 12 | { 13 | makeCurrent(); 14 | 15 | m_VBO[0].destroy(); 16 | m_VBO[1].destroy(); 17 | m_VAO[0].destroy(); 18 | m_VAO[1].destroy(); 19 | 20 | doneCurrent(); 21 | } 22 | 23 | void HelloTriangleExercise3::initializeGL() 24 | { 25 | if(!context()){ 26 | qCritical() << "Cant't get OpenGL contex"; 27 | close(); 28 | return; 29 | } 30 | initializeOpenGLFunctions(); 31 | 32 | //2D triangle 33 | float vertices[2][9] = { 34 | { 35 | -0.9f, -0.5f, 0.0f, // left 36 | -0.0f, -0.5f, 0.0f, // right 37 | -0.9f, 0.5f, 0.0f, // top 38 | }, 39 | { 40 | 0.0f, -0.5f, 0.0f, // left 41 | 0.9f, -0.5f, 0.0f, // right 42 | 0.9f, 0.5f, 0.0f // top 43 | } 44 | }; 45 | 46 | for(int i = 0; i < 2; ++i){ 47 | //shader初始化 48 | bool result = true; 49 | result = m_program[i].addShaderFromSourceFile(QOpenGLShader::Vertex, ":/1.getting_started/2.1hello_triangle/hello_triangle.vert"); 50 | if(!result){ 51 | qDebug() << m_program[i].log(); 52 | } 53 | if(i == 0){ 54 | result = m_program[i].addShaderFromSourceFile(QOpenGLShader::Fragment, ":/1.getting_started/2.1hello_triangle/hello_triangle.frag"); 55 | }else{ 56 | result = m_program[i].addShaderFromSourceFile(QOpenGLShader::Fragment, ":/1.getting_started/2.1hello_triangle/hello_triangle1.frag"); 57 | } 58 | 59 | if(!result){ 60 | qDebug() << m_program[i].log(); 61 | } 62 | result = m_program[i].link(); 63 | if(!result){ 64 | qDebug() << m_program[i].log(); 65 | } 66 | 67 | //1. 绑定顶点数组对象 68 | m_VAO[i].create(); 69 | QOpenGLVertexArrayObject::Binder vaoBinder(&m_VAO[i]); 70 | //2. 把顶点数组复制到缓冲中供OpenGL使用 71 | m_VBO[i].create(); 72 | m_VBO[i].bind(); 73 | m_VBO[i].allocate(vertices[i], sizeof(vertices[i])); 74 | //3. 设置顶点属性指针 75 | m_program[i].setAttributeBuffer(0, GL_FLOAT, 0, 3, sizeof(GLfloat) * 3); 76 | m_program[i].enableAttributeArray(0); 77 | } 78 | } 79 | 80 | void HelloTriangleExercise3::resizeGL(int w, int h) 81 | { 82 | glViewport(0, 0, w, h); 83 | } 84 | 85 | void HelloTriangleExercise3::paintGL() 86 | { 87 | glClearColor(0.2f, 0.3f, 0.3f, 1.0f); 88 | glClear(GL_COLOR_BUFFER_BIT); 89 | 90 | m_program[0].bind(); 91 | m_VAO[0].bind(); 92 | glDrawArrays(GL_TRIANGLES, 0, 3); 93 | 94 | m_program[1].bind(); 95 | m_VAO[1].bind(); 96 | glDrawArrays(GL_TRIANGLES, 0, 3); 97 | m_VAO[1].release(); 98 | m_program[1].release(); 99 | } 100 | 101 | -------------------------------------------------------------------------------- /src/1.getting_started/2.5hello_triangle_exercise3/HelloTriangleExercise3.h: -------------------------------------------------------------------------------- 1 | #ifndef HELLOTRIANGLEEXERCISE3_H 2 | #define HELLOTRIANGLEEXERCISE3_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | 10 | class HelloTriangleExercise3 : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core 11 | { 12 | Q_OBJECT 13 | public: 14 | Q_INVOKABLE HelloTriangleExercise3(QWidget *parent = nullptr); 15 | ~HelloTriangleExercise3(); 16 | 17 | protected: 18 | virtual void initializeGL() override; 19 | virtual void resizeGL(int w, int h) override; 20 | virtual void paintGL() override; 21 | 22 | private: 23 | QOpenGLVertexArrayObject m_VAO[2]; 24 | QOpenGLBuffer m_VBO[2]; 25 | 26 | QOpenGLShaderProgram m_program[2]; 27 | }; 28 | 29 | #endif // HELLOTRIANGLEEXERCISE3_H 30 | -------------------------------------------------------------------------------- /src/1.getting_started/3.2shaders_interpolation/ShadersInterpolation.h: -------------------------------------------------------------------------------- 1 | #ifndef SHADERSINTERPOLATION_H 2 | #define SHADERSINTERPOLATION_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | 11 | class ShadersInterpolation : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core 12 | { 13 | Q_OBJECT 14 | public: 15 | Q_INVOKABLE ShadersInterpolation(QWidget *parent = nullptr); 16 | ~ShadersInterpolation(); 17 | protected: 18 | virtual void initializeGL() override; 19 | virtual void resizeGL(int w, int h) override; 20 | virtual void paintGL() override; 21 | 22 | private: 23 | void handleTimeout(); 24 | 25 | private: 26 | QOpenGLVertexArrayObject m_VAO[2]; 27 | QOpenGLBuffer m_VBO[2]; 28 | 29 | QOpenGLShaderProgram m_program[2]; 30 | 31 | QTimer m_timer; 32 | }; 33 | 34 | #endif // SHADERSINTERPOLATION_H 35 | -------------------------------------------------------------------------------- /src/1.getting_started/3.2shaders_interpolation/shaders_interpolation.frag: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | out vec4 FragColor; 3 | 4 | uniform vec4 uColor;//和另一个 vertex shader 的变量不能相同 5 | 6 | void main(void) 7 | { 8 | FragColor = uColor; 9 | } 10 | -------------------------------------------------------------------------------- /src/1.getting_started/3.2shaders_interpolation/shaders_interpolation.vert: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | layout (location = 0) in vec3 aPos; 3 | 4 | out vec4 vertexColor; 5 | 6 | void main(void) 7 | { 8 | gl_Position = vec4(aPos, 1.0); 9 | vertexColor = vec4(0.5, 0.0, 0.0, 1.0); 10 | } 11 | -------------------------------------------------------------------------------- /src/1.getting_started/3.2shaders_interpolation/shaders_interpolation1.frag: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | out vec4 FragColor; 3 | 4 | in vec3 ourColor; 5 | 6 | void main(void) 7 | { 8 | FragColor = vec4(ourColor, 1.0); 9 | } 10 | -------------------------------------------------------------------------------- /src/1.getting_started/3.2shaders_interpolation/shaders_interpolation1.vert: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | layout (location = 0) in vec3 aPos; 3 | layout (location = 1) in vec3 aColor; // 颜色变量的属性位置值为 1 4 | 5 | out vec3 ourColor; 6 | 7 | void main(void) 8 | { 9 | gl_Position = vec4(aPos, 1.0); 10 | ourColor = aColor; 11 | } 12 | -------------------------------------------------------------------------------- /src/1.getting_started/4.1textures/Textures.cpp: -------------------------------------------------------------------------------- 1 | #include "Textures.h" 2 | 3 | #include 4 | 5 | Textures::Textures(QWidget *parent) 6 | : QOpenGLWidget(parent), 7 | m_VBO(QOpenGLBuffer::VertexBuffer) 8 | { 9 | 10 | } 11 | 12 | Textures::~Textures() 13 | { 14 | makeCurrent(); 15 | 16 | m_VBO.destroy(); 17 | m_VAO.destroy(); 18 | m_texture[0]->destroy(); 19 | m_texture[1]->destroy(); 20 | 21 | doneCurrent(); 22 | } 23 | 24 | void Textures::initializeGL() 25 | { 26 | if(!context()){ 27 | qCritical() << "Cant't get OpenGL contex"; 28 | close(); 29 | return; 30 | } 31 | initializeOpenGLFunctions(); 32 | 33 | //shader初始化 34 | { 35 | bool result = true; 36 | result = m_program.addShaderFromSourceFile(QOpenGLShader::Vertex, ":/1.getting_started/4.1textures/textures.vert"); 37 | if(!result){ 38 | qDebug() << m_program.log(); 39 | } 40 | result = m_program.addShaderFromSourceFile(QOpenGLShader::Fragment, ":/1.getting_started/4.1textures/textures.frag"); 41 | if(!result){ 42 | qDebug() << m_program.log(); 43 | } 44 | result = m_program.link(); 45 | if(!result){ 46 | qDebug() << m_program.log(); 47 | } 48 | } 49 | // 50 | { 51 | //2D rect 52 | GLfloat vertices[] = { 53 | // 位置 // 颜色 //纹理坐标 54 | 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, // 右下 55 | -0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, // 左下 56 | -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, // 左下 57 | 0.5f, 0.5f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, // 右上 58 | }; 59 | //1. 绑定顶点数组对象 60 | m_VAO.create(); 61 | QOpenGLVertexArrayObject::Binder vaoBinder(&m_VAO); 62 | //2. 把顶点数组复制到缓冲中供OpenGL使用 63 | m_VBO.create(); 64 | m_VBO.bind(); 65 | m_VBO.allocate(vertices, sizeof(vertices)); 66 | //3. 设置顶点属性指针 67 | //3.1 位置 68 | m_program.setAttributeBuffer(0, GL_FLOAT, 0, 3, sizeof(GLfloat) * 8); 69 | m_program.enableAttributeArray(0); 70 | //3.2 颜色 71 | m_program.setAttributeBuffer(1, GL_FLOAT, sizeof(GLfloat) * 3, 3, sizeof(GLfloat) * 8); 72 | m_program.enableAttributeArray(1); 73 | //3.3 纹理 74 | m_program.setAttributeBuffer(2, GL_FLOAT, sizeof(GLfloat) * 6, 2, sizeof(GLfloat) * 8); 75 | m_program.enableAttributeArray(2); 76 | } 77 | //texture 78 | m_texture[0] = std::make_unique(QImage(":/resources/textures/awesomeface.png").mirrored()); 79 | m_texture[1] = std::make_unique(QImage(":/resources/textures/container.jpg").mirrored()); 80 | for(int i = 0; i < 2; ++i){ 81 | m_texture[i]->create(); 82 | //纹理环绕方式 83 | m_texture[i]->setWrapMode(QOpenGLTexture::DirectionS, QOpenGLTexture::Repeat); 84 | m_texture[i]->setWrapMode(QOpenGLTexture::DirectionT, QOpenGLTexture::Repeat); 85 | //纹理过滤 86 | m_texture[i]->setMinMagFilters(QOpenGLTexture::Nearest, QOpenGLTexture::Linear); 87 | //多级渐远纹理 88 | m_texture[i]->generateMipMaps(); 89 | m_texture[i]->setMinMagFilters(QOpenGLTexture::LinearMipMapLinear, QOpenGLTexture::Linear); 90 | } 91 | } 92 | 93 | void Textures::resizeGL(int w, int h) 94 | { 95 | glViewport(0, 0, w, h); 96 | } 97 | 98 | void Textures::paintGL() 99 | { 100 | glClearColor(0.2f, 0.3f, 0.3f, 1.0f); 101 | glClear(GL_COLOR_BUFFER_BIT); 102 | 103 | m_program.bind(); 104 | m_texture[0]->bind(0); 105 | m_program.setUniformValue("texture1", 0); 106 | m_texture[1]->bind(1); 107 | m_program.setUniformValue("texture2", 1); 108 | QOpenGLVertexArrayObject::Binder vaoBinder(&m_VAO); 109 | glDrawArrays(GL_TRIANGLE_FAN, 0, 4);//GL_POLYGON在3.x版本已弃用 110 | m_texture[0]->release(); 111 | m_texture[1]->release(); 112 | m_program.release(); 113 | } 114 | 115 | -------------------------------------------------------------------------------- /src/1.getting_started/4.1textures/Textures.h: -------------------------------------------------------------------------------- 1 | #ifndef TEXTURES_H 2 | #define TEXTURES_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | 12 | class Textures : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core 13 | { 14 | Q_OBJECT 15 | public: 16 | Q_INVOKABLE Textures(QWidget *parent = nullptr); 17 | ~Textures(); 18 | protected: 19 | virtual void initializeGL() override; 20 | virtual void resizeGL(int w, int h) override; 21 | virtual void paintGL() override; 22 | 23 | private: 24 | QOpenGLVertexArrayObject m_VAO; 25 | QOpenGLBuffer m_VBO; 26 | 27 | QOpenGLShaderProgram m_program; 28 | 29 | std::unique_ptr m_texture[2]; 30 | }; 31 | 32 | #endif // TEXTURES_H 33 | -------------------------------------------------------------------------------- /src/1.getting_started/4.1textures/textures.frag: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | out vec4 FragColor; 3 | 4 | in vec3 ourColor; 5 | in vec2 TexCoord; 6 | 7 | uniform sampler2D texture1; 8 | uniform sampler2D texture2; 9 | 10 | void main(void) 11 | { 12 | FragColor = mix(texture2D(texture1, vec2(1.0 - TexCoord.x, TexCoord.y)), texture2D(texture2, TexCoord), 0.4) * vec4(ourColor, 1.0); 13 | } 14 | -------------------------------------------------------------------------------- /src/1.getting_started/4.1textures/textures.vert: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | layout (location = 0) in vec3 aPos; 3 | layout (location = 1) in vec3 aColor; 4 | layout (location = 2) in vec2 aTexCoord; 5 | 6 | out vec3 ourColor; 7 | out vec2 TexCoord; 8 | 9 | void main(void) 10 | { 11 | gl_Position = vec4(aPos, 1.0); 12 | ourColor = aColor; 13 | TexCoord = aTexCoord; 14 | } 15 | -------------------------------------------------------------------------------- /src/1.getting_started/4.4textures_exercise2/TexturesExercise2.h: -------------------------------------------------------------------------------- 1 | #ifndef TEXTURESEXERCISE2_H 2 | #define TEXTURESEXERCISE2_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | 12 | class TexturesExercise2 : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core 13 | { 14 | Q_OBJECT 15 | public: 16 | Q_INVOKABLE TexturesExercise2(QWidget *parent = nullptr); 17 | ~TexturesExercise2(); 18 | protected: 19 | virtual void initializeGL() override; 20 | virtual void resizeGL(int w, int h) override; 21 | virtual void paintGL() override; 22 | 23 | private: 24 | QOpenGLVertexArrayObject m_VAO; 25 | QOpenGLBuffer m_VBO; 26 | 27 | QOpenGLShaderProgram m_program; 28 | 29 | std::unique_ptr m_texture[2]; 30 | }; 31 | 32 | #endif // TEXTURESEXERCISE2_H 33 | -------------------------------------------------------------------------------- /src/1.getting_started/4.4textures_exercise2/textures_exercise2.frag: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | out vec4 FragColor; 3 | 4 | in vec3 ourColor; 5 | in vec2 TexCoord; 6 | 7 | uniform sampler2D texture1; 8 | uniform sampler2D texture2; 9 | 10 | void main(void) 11 | { 12 | FragColor = mix(texture2D(texture1, TexCoord), texture2D(texture2, TexCoord), 0.8); 13 | } 14 | -------------------------------------------------------------------------------- /src/1.getting_started/4.4textures_exercise2/textures_exercise2.vert: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | layout (location = 0) in vec3 aPos; 3 | layout (location = 1) in vec3 aColor; 4 | layout (location = 2) in vec2 aTexCoord; 5 | 6 | out vec3 ourColor; 7 | out vec2 TexCoord; 8 | 9 | void main(void) 10 | { 11 | gl_Position = vec4(aPos, 1.0); 12 | ourColor = aColor; 13 | TexCoord = aTexCoord; 14 | } 15 | -------------------------------------------------------------------------------- /src/1.getting_started/4.5textures_exercise3/TexturesExercise3.cpp: -------------------------------------------------------------------------------- 1 | #include "TexturesExercise3.h" 2 | 3 | #include 4 | 5 | TexturesExercise3::TexturesExercise3(QWidget *parent) 6 | : QOpenGLWidget(parent), 7 | m_VBO(QOpenGLBuffer::VertexBuffer) 8 | { 9 | 10 | } 11 | 12 | TexturesExercise3::~TexturesExercise3() 13 | { 14 | makeCurrent(); 15 | 16 | m_VBO.destroy(); 17 | m_VAO.destroy(); 18 | m_texture[0]->destroy(); 19 | m_texture[1]->destroy(); 20 | 21 | doneCurrent(); 22 | } 23 | 24 | void TexturesExercise3::initializeGL() 25 | { 26 | if(!context()){ 27 | qCritical() << "Cant't get OpenGL contex"; 28 | close(); 29 | return; 30 | } 31 | initializeOpenGLFunctions(); 32 | 33 | //shader初始化 34 | { 35 | bool result = true; 36 | result = m_program.addShaderFromSourceFile(QOpenGLShader::Vertex, ":/1.getting_started/4.4textures_exercise2/textures_exercise2.vert"); 37 | if(!result){ 38 | qDebug() << m_program.log(); 39 | } 40 | result = m_program.addShaderFromSourceFile(QOpenGLShader::Fragment, ":/1.getting_started/4.4textures_exercise2/textures_exercise2.frag"); 41 | if(!result){ 42 | qDebug() << m_program.log(); 43 | } 44 | result = m_program.link(); 45 | if(!result){ 46 | qDebug() << m_program.log(); 47 | } 48 | } 49 | // 50 | { 51 | //2D rect 52 | GLfloat vertices[] = { 53 | // 位置 // 颜色 //纹理坐标 54 | 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 0.55f, 0.45f, // 右下 55 | -0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.45f, 0.45f, // 左下 56 | -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 0.45f, 0.55f, // 左上 57 | 0.5f, 0.5f, 0.0f, 0.0f, 0.0f, 1.0f, 0.55f, 0.55f, // 右上 58 | }; 59 | //1. 绑定顶点数组对象 60 | m_VAO.create(); 61 | QOpenGLVertexArrayObject::Binder vaoBinder(&m_VAO); 62 | //2. 把顶点数组复制到缓冲中供OpenGL使用 63 | m_VBO.create(); 64 | m_VBO.bind(); 65 | m_VBO.allocate(vertices, sizeof(vertices)); 66 | //3. 设置顶点属性指针 67 | //3.1 位置 68 | m_program.setAttributeBuffer(0, GL_FLOAT, 0, 3, sizeof(GLfloat) * 8); 69 | m_program.enableAttributeArray(0); 70 | //3.2 颜色 71 | m_program.setAttributeBuffer(1, GL_FLOAT, sizeof(GLfloat) * 3, 3, sizeof(GLfloat) * 8); 72 | m_program.enableAttributeArray(1); 73 | //3.3 纹理 74 | m_program.setAttributeBuffer(2, GL_FLOAT, sizeof(GLfloat) * 6, 2, sizeof(GLfloat) * 8); 75 | m_program.enableAttributeArray(2); 76 | } 77 | //texture 78 | m_texture[0] = std::make_unique(QImage(":/resources/textures/awesomeface.png").mirrored()); 79 | m_texture[1] = std::make_unique(QImage(":/resources/textures/container.jpg").mirrored()); 80 | for(int i = 0; i < 2; ++i){ 81 | m_texture[i]->create(); 82 | //纹理环绕方式 83 | m_texture[i]->setWrapMode(QOpenGLTexture::DirectionS, QOpenGLTexture::Repeat); 84 | m_texture[i]->setWrapMode(QOpenGLTexture::DirectionT, QOpenGLTexture::Repeat); 85 | //纹理过滤 86 | m_texture[i]->setMinMagFilters(QOpenGLTexture::Nearest, QOpenGLTexture::Nearest); 87 | //多级渐远纹理 88 | m_texture[i]->generateMipMaps(); 89 | m_texture[i]->setMinMagFilters(QOpenGLTexture::LinearMipMapLinear, QOpenGLTexture::Linear); 90 | } 91 | } 92 | 93 | void TexturesExercise3::resizeGL(int w, int h) 94 | { 95 | glViewport(0, 0, w, h); 96 | } 97 | 98 | void TexturesExercise3::paintGL() 99 | { 100 | glClearColor(0.2f, 0.3f, 0.3f, 1.0f); 101 | glClear(GL_COLOR_BUFFER_BIT); 102 | 103 | m_program.bind(); 104 | m_texture[0]->bind(0); 105 | m_program.setUniformValue("texture1", 0); 106 | m_texture[1]->bind(1); 107 | m_program.setUniformValue("texture2", 1); 108 | QOpenGLVertexArrayObject::Binder vaoBinder(&m_VAO); 109 | glDrawArrays(GL_TRIANGLE_FAN, 0, 4);//GL_POLYGON在3.x版本已弃用 110 | m_texture[0]->release(); 111 | m_texture[1]->release(); 112 | m_program.release(); 113 | } 114 | 115 | -------------------------------------------------------------------------------- /src/1.getting_started/4.5textures_exercise3/TexturesExercise3.h: -------------------------------------------------------------------------------- 1 | #ifndef TEXTURESEXERCISE3_H 2 | #define TEXTURESEXERCISE3_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | 12 | class TexturesExercise3 : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core 13 | { 14 | Q_OBJECT 15 | public: 16 | Q_INVOKABLE TexturesExercise3(QWidget *parent = nullptr); 17 | ~TexturesExercise3(); 18 | protected: 19 | virtual void initializeGL() override; 20 | virtual void resizeGL(int w, int h) override; 21 | virtual void paintGL() override; 22 | 23 | private: 24 | QOpenGLVertexArrayObject m_VAO; 25 | QOpenGLBuffer m_VBO; 26 | 27 | QOpenGLShaderProgram m_program; 28 | 29 | std::unique_ptr m_texture[2]; 30 | }; 31 | 32 | #endif // TEXTURESEXERCISE3_H 33 | -------------------------------------------------------------------------------- /src/1.getting_started/4.6textures_exercise4/TexturesExercise4.h: -------------------------------------------------------------------------------- 1 | #ifndef TEXTURESEXERCISE4_H 2 | #define TEXTURESEXERCISE4_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | 12 | class TexturesExercise4 : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core 13 | { 14 | Q_OBJECT 15 | public: 16 | Q_INVOKABLE TexturesExercise4(QWidget *parent = nullptr); 17 | ~TexturesExercise4(); 18 | protected: 19 | virtual void initializeGL() override; 20 | virtual void resizeGL(int w, int h) override; 21 | virtual void paintGL() override; 22 | 23 | private: 24 | void handleValueChanged(int value); 25 | 26 | private: 27 | QOpenGLVertexArrayObject m_VAO; 28 | QOpenGLBuffer m_VBO; 29 | 30 | QOpenGLShaderProgram m_program; 31 | 32 | std::unique_ptr m_texture[2]; 33 | 34 | float m_percent; 35 | }; 36 | 37 | #endif // TEXTURESEXERCISE4_H 38 | -------------------------------------------------------------------------------- /src/1.getting_started/4.6textures_exercise4/textures_exercise4.frag: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | out vec4 FragColor; 3 | 4 | in vec3 ourColor; 5 | in vec2 TexCoord; 6 | 7 | uniform sampler2D texture1; 8 | uniform sampler2D texture2; 9 | 10 | uniform float percent; 11 | 12 | void main(void) 13 | { 14 | FragColor = mix(texture2D(texture1, TexCoord), texture2D(texture2, TexCoord), percent); 15 | } 16 | -------------------------------------------------------------------------------- /src/1.getting_started/4.6textures_exercise4/textures_exercise4.vert: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | layout (location = 0) in vec3 aPos; 3 | layout (location = 1) in vec3 aColor; 4 | layout (location = 2) in vec2 aTexCoord; 5 | 6 | out vec3 ourColor; 7 | out vec2 TexCoord; 8 | 9 | void main(void) 10 | { 11 | gl_Position = vec4(aPos, 1.0); 12 | ourColor = aColor; 13 | TexCoord = aTexCoord; 14 | } 15 | -------------------------------------------------------------------------------- /src/1.getting_started/5.1transformations/Transformations.h: -------------------------------------------------------------------------------- 1 | #ifndef TRANSFORMATIONS_H 2 | #define TRANSFORMATIONS_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | 15 | class Transformations : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core 16 | { 17 | Q_OBJECT 18 | public: 19 | Q_INVOKABLE Transformations(QWidget *parent = nullptr); 20 | ~Transformations(); 21 | protected: 22 | virtual void initializeGL() override; 23 | virtual void resizeGL(int w, int h) override; 24 | virtual void paintGL() override; 25 | 26 | virtual void mousePressEvent(QMouseEvent* event) override; 27 | virtual void mouseMoveEvent(QMouseEvent* event) override; 28 | virtual void wheelEvent(QWheelEvent* event) override; 29 | 30 | private: 31 | QOpenGLVertexArrayObject m_VAO; 32 | QOpenGLBuffer m_VBO; 33 | 34 | QOpenGLShaderProgram m_program; 35 | 36 | std::unique_ptr m_texture[2]; 37 | 38 | QMatrix4x4 m_transform; 39 | 40 | float m_scale; 41 | 42 | QPoint m_mousePos; 43 | }; 44 | 45 | #endif // TRANSFORMATIONS_H 46 | -------------------------------------------------------------------------------- /src/1.getting_started/5.1transformations/transformations.frag: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | out vec4 FragColor; 3 | 4 | in vec3 ourColor; 5 | in vec2 TexCoord; 6 | 7 | uniform sampler2D texture1; 8 | uniform sampler2D texture2; 9 | 10 | void main(void) 11 | { 12 | FragColor = mix(texture2D(texture1, TexCoord), texture2D(texture2, TexCoord), 0.4) * vec4(ourColor, 1.0); 13 | } 14 | -------------------------------------------------------------------------------- /src/1.getting_started/5.1transformations/transformations.vert: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | layout (location = 0) in vec3 aPos; 3 | layout (location = 1) in vec3 aColor; 4 | layout (location = 2) in vec2 aTexCoord; 5 | 6 | out vec3 ourColor; 7 | out vec2 TexCoord; 8 | 9 | uniform mat4 transform; 10 | 11 | void main(void) 12 | { 13 | gl_Position = transform * vec4(aPos, 1.0); 14 | ourColor = aColor; 15 | TexCoord = aTexCoord; 16 | } 17 | -------------------------------------------------------------------------------- /src/1.getting_started/6.1coordinate_systems/CoordinateSystems.frag: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | out vec4 FragColor; 3 | 4 | in vec2 TexCoord; 5 | in vec3 ourColor; 6 | 7 | uniform sampler2D texture1; 8 | uniform sampler2D texture2; 9 | 10 | void main(void) 11 | { 12 | FragColor = mix(texture2D(texture1, TexCoord), texture2D(texture2, TexCoord), 0.4) * vec4(ourColor, 1.0); 13 | } 14 | -------------------------------------------------------------------------------- /src/1.getting_started/6.1coordinate_systems/CoordinateSystems.h: -------------------------------------------------------------------------------- 1 | #ifndef COORDINATESYSTEMS_H 2 | #define COORDINATESYSTEMS_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | 15 | class CoordinateSystems : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core 16 | { 17 | Q_OBJECT 18 | public: 19 | Q_INVOKABLE CoordinateSystems(QWidget *parent = nullptr); 20 | ~CoordinateSystems(); 21 | protected: 22 | virtual void initializeGL() override; 23 | virtual void resizeGL(int w, int h) override; 24 | virtual void paintGL() override; 25 | 26 | virtual void mousePressEvent(QMouseEvent* event) override; 27 | virtual void mouseMoveEvent(QMouseEvent* event) override; 28 | virtual void wheelEvent(QWheelEvent* event) override; 29 | 30 | private: 31 | QOpenGLVertexArrayObject m_VAO; 32 | QOpenGLBuffer m_VBO; 33 | 34 | QOpenGLShaderProgram m_program; 35 | 36 | std::unique_ptr m_texture[2]; 37 | 38 | QMatrix4x4 m_model; 39 | QMatrix4x4 m_view; 40 | QMatrix4x4 m_projection; 41 | 42 | float m_scale; 43 | }; 44 | 45 | #endif // COORDINATESYSTEMS_H 46 | -------------------------------------------------------------------------------- /src/1.getting_started/6.1coordinate_systems/CoordinateSystems.vert: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | layout (location = 0) in vec3 aPos; 3 | layout (location = 1) in vec3 aColor; 4 | layout (location = 2) in vec2 aTexCoord; 5 | 6 | out vec3 ourColor; 7 | out vec2 TexCoord; 8 | 9 | uniform mat4 model; 10 | uniform mat4 view; 11 | uniform mat4 projection; 12 | 13 | void main(void) 14 | { 15 | gl_Position = projection * view * model * vec4(aPos, 1.0); 16 | ourColor = aColor; 17 | TexCoord = aTexCoord; 18 | } 19 | -------------------------------------------------------------------------------- /src/1.getting_started/6.2coordinate_systems_depth/CoordinateSystemsDepth.frag: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | out vec4 FragColor; 3 | 4 | in vec2 TexCoord; 5 | 6 | uniform sampler2D texture1; 7 | uniform sampler2D texture2; 8 | 9 | void main(void) 10 | { 11 | FragColor = mix(texture2D(texture1, TexCoord), texture2D(texture2, TexCoord), 0.4); 12 | } 13 | -------------------------------------------------------------------------------- /src/1.getting_started/6.2coordinate_systems_depth/CoordinateSystemsDepth.h: -------------------------------------------------------------------------------- 1 | #ifndef COORDINATESYSTEMSDEPTH_H 2 | #define COORDINATESYSTEMSDEPTH_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | 16 | class CoordinateSystemsDepth : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core 17 | { 18 | Q_OBJECT 19 | public: 20 | Q_INVOKABLE CoordinateSystemsDepth(QWidget *parent = nullptr); 21 | ~CoordinateSystemsDepth(); 22 | protected: 23 | virtual void initializeGL() override; 24 | virtual void resizeGL(int w, int h) override; 25 | virtual void paintGL() override; 26 | 27 | virtual void mousePressEvent(QMouseEvent* event) override; 28 | virtual void mouseMoveEvent(QMouseEvent* event) override; 29 | virtual void wheelEvent(QWheelEvent* event) override; 30 | 31 | private: 32 | void handleTimeout(); 33 | 34 | private: 35 | QOpenGLVertexArrayObject m_VAO; 36 | QOpenGLBuffer m_VBO; 37 | 38 | QOpenGLShaderProgram m_program; 39 | 40 | std::unique_ptr m_texture[2]; 41 | 42 | std::vector m_cubePositions; 43 | std::vector m_models; 44 | 45 | QMatrix4x4 m_view; 46 | QMatrix4x4 m_projection; 47 | 48 | QTimer m_timer; 49 | 50 | bool m_depthEnabled; 51 | }; 52 | 53 | #endif // COORDINATESYSTEMSDEPTH_H 54 | -------------------------------------------------------------------------------- /src/1.getting_started/6.2coordinate_systems_depth/CoordinateSystemsDepth.vert: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | layout (location = 0) in vec3 aPos; 3 | layout (location = 1) in vec2 aTexCoord; 4 | 5 | out vec2 TexCoord; 6 | 7 | uniform mat4 model; 8 | uniform mat4 view; 9 | uniform mat4 projection; 10 | 11 | void main(void) 12 | { 13 | gl_Position = projection * view * model * vec4(aPos, 1.0); 14 | TexCoord = aTexCoord; 15 | } 16 | -------------------------------------------------------------------------------- /src/1.getting_started/6.3coordinate_systems_exercise/CoordinateSystemsExercise.h: -------------------------------------------------------------------------------- 1 | #ifndef COORDINATESYSTEMSEXERCISE_H 2 | #define COORDINATESYSTEMSEXERCISE_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | 17 | class CoordinateSystemsExercise : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core 18 | { 19 | Q_OBJECT 20 | public: 21 | Q_INVOKABLE CoordinateSystemsExercise(QWidget *parent = nullptr); 22 | ~CoordinateSystemsExercise(); 23 | protected: 24 | virtual void initializeGL() override; 25 | virtual void resizeGL(int w, int h) override; 26 | virtual void paintGL() override; 27 | 28 | virtual void mousePressEvent(QMouseEvent* event) override; 29 | virtual void mouseMoveEvent(QMouseEvent* event) override; 30 | virtual void wheelEvent(QWheelEvent* event) override; 31 | 32 | private: 33 | void handleTimeout(); 34 | void handleMatrix(); 35 | 36 | private: 37 | QOpenGLVertexArrayObject m_VAO; 38 | QOpenGLBuffer m_VBO; 39 | 40 | QOpenGLShaderProgram m_program; 41 | 42 | std::unique_ptr m_texture[2]; 43 | 44 | std::vector m_sliders; 45 | 46 | std::vector m_cubePositions; 47 | std::vector m_models; 48 | 49 | QMatrix4x4 m_view; 50 | QMatrix4x4 m_projection; 51 | 52 | float m_fov; 53 | float m_aspectRatio; 54 | float m_nearPlane; 55 | float m_farPlane; 56 | 57 | QTimer m_timer; 58 | }; 59 | 60 | #endif // COORDINATESYSTEMSEXERCISE_H 61 | -------------------------------------------------------------------------------- /src/1.getting_started/7.1camera_circle/CameraCircle.h: -------------------------------------------------------------------------------- 1 | #ifndef CAMERACIRCLE_H 2 | #define CAMERACIRCLE_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | 16 | class CameraCircle : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core 17 | { 18 | Q_OBJECT 19 | public: 20 | Q_INVOKABLE CameraCircle(QWidget *parent = nullptr); 21 | ~CameraCircle(); 22 | protected: 23 | virtual void initializeGL() override; 24 | virtual void resizeGL(int w, int h) override; 25 | virtual void paintGL() override; 26 | 27 | private: 28 | void handleTimeout(); 29 | 30 | private: 31 | QOpenGLVertexArrayObject m_VAO; 32 | QOpenGLBuffer m_VBO; 33 | 34 | QOpenGLShaderProgram m_program; 35 | 36 | std::unique_ptr m_texture[2]; 37 | 38 | std::vector m_cubePositions; 39 | std::vector m_models; 40 | 41 | QMatrix4x4 m_view; 42 | QMatrix4x4 m_projection; 43 | //摄像机位置 44 | QVector3D m_cameraPos; 45 | //摄像机方向 46 | QVector3D m_cameraTarget; 47 | QVector3D m_cameraDirection; 48 | //上轴 49 | QVector3D m_cameraUp; 50 | 51 | QTimer m_timer; 52 | }; 53 | 54 | #endif // CAMERACIRCLE_H 55 | -------------------------------------------------------------------------------- /src/1.getting_started/7.2camera_interact/CameraInteract.h: -------------------------------------------------------------------------------- 1 | #ifndef CAMERAINTERACT_H 2 | #define CAMERAINTERACT_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | 16 | class CameraInteract : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core 17 | { 18 | Q_OBJECT 19 | public: 20 | Q_INVOKABLE CameraInteract(QWidget *parent = nullptr); 21 | ~CameraInteract(); 22 | protected: 23 | virtual void initializeGL() override; 24 | virtual void resizeGL(int w, int h) override; 25 | virtual void paintGL() override; 26 | 27 | virtual void keyPressEvent(QKeyEvent* event) override; 28 | virtual void keyReleaseEvent(QKeyEvent* event) override; 29 | virtual void timerEvent(QTimerEvent* event) override; 30 | virtual void mouseMoveEvent(QMouseEvent* event) override; 31 | virtual void wheelEvent(QWheelEvent* event) override; 32 | 33 | private: 34 | QOpenGLVertexArrayObject m_VAO; 35 | QOpenGLBuffer m_VBO; 36 | 37 | QOpenGLShaderProgram m_program; 38 | 39 | std::unique_ptr m_texture[2]; 40 | 41 | std::vector m_cubePositions; 42 | std::vector m_models; 43 | 44 | QMatrix4x4 m_view; 45 | QMatrix4x4 m_projection; 46 | //摄像机位置 47 | QVector3D m_cameraPos; 48 | //摄像机方向 49 | QVector3D m_cameraDirection; 50 | //上轴 51 | QVector3D m_cameraUp; 52 | 53 | //interact 54 | //key 55 | QSet m_pressedKeys; 56 | int m_timerId; 57 | float m_deltaTime;//当前帧与上一帧的时间差 58 | float m_lastFrame;//上一帧的时间 59 | float m_moveSpeed; 60 | 61 | float m_yaw;//偏航角 62 | float m_pitch;//俯视角 63 | float m_sensitivity;//鼠标灵敏度 64 | 65 | float m_fov; 66 | 67 | QPoint m_lastMousePos; 68 | }; 69 | 70 | #endif // CAMERAINTERACT_H 71 | -------------------------------------------------------------------------------- /src/1.getting_started/7.4camera_class/CameraClass.h: -------------------------------------------------------------------------------- 1 | #ifndef CAMERACLASS_H 2 | #define CAMERACLASS_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include "../../utils/CameraUtil.h" 13 | 14 | class CameraClass : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core 15 | { 16 | Q_OBJECT 17 | public: 18 | Q_INVOKABLE CameraClass(QWidget *parent = nullptr); 19 | ~CameraClass(); 20 | protected: 21 | virtual void initializeGL() override; 22 | virtual void resizeGL(int w, int h) override; 23 | virtual void paintGL() override; 24 | 25 | virtual bool event(QEvent *e) override; 26 | 27 | private: 28 | QOpenGLVertexArrayObject m_VAO; 29 | QOpenGLBuffer m_VBO; 30 | 31 | QOpenGLShaderProgram m_program; 32 | 33 | std::unique_ptr m_texture[2]; 34 | 35 | std::vector m_cubePositions; 36 | std::vector m_models; 37 | 38 | QMatrix4x4 m_projection; 39 | 40 | CameraUtil m_camera; 41 | }; 42 | 43 | #endif // CAMERACLASS_H 44 | -------------------------------------------------------------------------------- /src/2.lighting/1.colors/Colors.h: -------------------------------------------------------------------------------- 1 | #ifndef COLORS_H 2 | #define COLORS_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include "../../utils/CameraUtil.h" 14 | 15 | class Colors : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core 16 | { 17 | Q_OBJECT 18 | public: 19 | Q_INVOKABLE Colors(QWidget *parent = nullptr); 20 | ~Colors(); 21 | protected: 22 | virtual void initializeGL() override; 23 | virtual void resizeGL(int w, int h) override; 24 | virtual void paintGL() override; 25 | 26 | virtual bool event(QEvent *e) override; 27 | 28 | private: 29 | QOpenGLVertexArrayObject m_lightVAO; 30 | QOpenGLVertexArrayObject m_lightCubeVAO; 31 | QOpenGLBuffer m_VBO; 32 | 33 | QOpenGLShaderProgram m_lightShader; 34 | QOpenGLShaderProgram m_lightCubeShader; 35 | 36 | QVector3D m_lightPos; 37 | 38 | QMatrix4x4 m_projection; 39 | 40 | CameraUtil m_camera; 41 | 42 | QLabel* m_labelYaw; 43 | QLabel* m_labelPitch; 44 | }; 45 | 46 | #endif // COLORS_H 47 | -------------------------------------------------------------------------------- /src/2.lighting/1.colors/colors.frag: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | out vec4 FragColor; 3 | 4 | uniform vec3 objectColor; 5 | uniform vec3 lightColor; 6 | 7 | void main() 8 | { 9 | FragColor = vec4(lightColor * objectColor, 1.0); 10 | } 11 | -------------------------------------------------------------------------------- /src/2.lighting/1.colors/colors.vert: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | layout (location = 0) in vec3 aPos; 3 | 4 | uniform mat4 model; 5 | uniform mat4 view; 6 | uniform mat4 projection; 7 | 8 | void main() 9 | { 10 | gl_Position = projection * view * model * vec4(aPos, 1.0); 11 | } 12 | -------------------------------------------------------------------------------- /src/2.lighting/1.colors/light_cube.frag: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | out vec4 FragColor; 3 | 4 | void main() 5 | { 6 | FragColor = vec4(1.0); // set alle 4 vector values to 1.0 7 | } 8 | -------------------------------------------------------------------------------- /src/2.lighting/1.colors/light_cube.vert: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | layout (location = 0) in vec3 aPos; 3 | 4 | uniform mat4 model; 5 | uniform mat4 view; 6 | uniform mat4 projection; 7 | 8 | void main() 9 | { 10 | gl_Position = projection * view * model * vec4(aPos, 1.0); 11 | } 12 | -------------------------------------------------------------------------------- /src/2.lighting/2.1basic_lighting_diffuse/BasicLightingDiffuse.h: -------------------------------------------------------------------------------- 1 | #ifndef BASICLIGHTINGDIFFUSE_H 2 | #define BASICLIGHTINGDIFFUSE_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include "../../utils/CameraUtil.h" 14 | 15 | class BasicLightingDiffuse : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core 16 | { 17 | Q_OBJECT 18 | public: 19 | Q_INVOKABLE BasicLightingDiffuse(QWidget *parent = nullptr); 20 | ~BasicLightingDiffuse(); 21 | protected: 22 | virtual void initializeGL() override; 23 | virtual void resizeGL(int w, int h) override; 24 | virtual void paintGL() override; 25 | 26 | virtual bool event(QEvent *e) override; 27 | 28 | private: 29 | QOpenGLVertexArrayObject m_lightVAO; 30 | QOpenGLVertexArrayObject m_lightCubeVAO; 31 | QOpenGLBuffer m_VBO; 32 | 33 | QOpenGLShaderProgram m_lightShader; 34 | QOpenGLShaderProgram m_lightCubeShader; 35 | 36 | QVector3D m_lightPos; 37 | 38 | QMatrix4x4 m_projection; 39 | 40 | CameraUtil m_camera; 41 | 42 | QLabel* m_labelYaw; 43 | QLabel* m_labelPitch; 44 | }; 45 | 46 | #endif // COLORS_H 47 | -------------------------------------------------------------------------------- /src/2.lighting/2.1basic_lighting_diffuse/basic_lighting.frag: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | in vec3 Normal; 3 | in vec3 FragPos; 4 | 5 | out vec4 FragColor; 6 | 7 | uniform vec3 lightPos; 8 | uniform vec3 objectColor; 9 | uniform vec3 lightColor; 10 | 11 | void main() 12 | { 13 | //环境光 14 | float ambientStrength = 0.1; 15 | vec3 ambient = ambientStrength * lightColor; 16 | //漫反射光 17 | vec3 norm = normalize(Normal); 18 | vec3 lightDir = normalize(lightPos - FragPos); 19 | float diff = max(dot(norm, lightDir), 0.0); 20 | vec3 diffuse = diff * lightColor; 21 | 22 | FragColor = vec4((ambient + diffuse) * objectColor, 1.0); 23 | } 24 | -------------------------------------------------------------------------------- /src/2.lighting/2.1basic_lighting_diffuse/basic_lighting.vert: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | layout (location = 0) in vec3 aPos; 3 | layout (location = 1) in vec3 aNormal; 4 | 5 | out vec3 Normal; 6 | out vec3 FragPos; 7 | 8 | uniform mat4 model; 9 | uniform mat4 view; 10 | uniform mat4 projection; 11 | 12 | void main() 13 | { 14 | gl_Position = projection * view * model * vec4(aPos, 1.0); 15 | Normal = aNormal; 16 | FragPos = vec3(model * vec4(aPos, 1.0)); 17 | } 18 | -------------------------------------------------------------------------------- /src/2.lighting/2.2basic_lighting_specular/BasicLightingSpecular.h: -------------------------------------------------------------------------------- 1 | #ifndef BASICLIGHTINGSPECULAR_H 2 | #define BASICLIGHTINGSPECULAR_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include "../../utils/CameraUtil.h" 15 | 16 | class BasicLightingSpecular : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core 17 | { 18 | Q_OBJECT 19 | public: 20 | Q_INVOKABLE BasicLightingSpecular(QWidget *parent = nullptr); 21 | ~BasicLightingSpecular(); 22 | protected: 23 | virtual void initializeGL() override; 24 | virtual void resizeGL(int w, int h) override; 25 | virtual void paintGL() override; 26 | 27 | virtual bool event(QEvent *e) override; 28 | 29 | private: 30 | QOpenGLVertexArrayObject m_lightVAO; 31 | QOpenGLVertexArrayObject m_lightCubeVAO; 32 | QOpenGLBuffer m_VBO; 33 | 34 | QOpenGLShaderProgram m_lightShader; 35 | QOpenGLShaderProgram m_lightCubeShader; 36 | 37 | QVector3D m_lightPos; 38 | 39 | QMatrix4x4 m_projection; 40 | 41 | CameraUtil m_camera; 42 | 43 | QSlider* m_sliderAmbientStrength; 44 | QSlider* m_sliderSpecularStrength; 45 | QSlider* m_sliderSpecularShininess; 46 | }; 47 | 48 | #endif // BASICLIGHTINGSPECULAR_H 49 | -------------------------------------------------------------------------------- /src/2.lighting/2.2basic_lighting_specular/basic_lighting.frag: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | in vec3 Normal; 3 | in vec3 FragPos; 4 | 5 | out vec4 FragColor; 6 | 7 | uniform vec3 viewPos; 8 | uniform vec3 lightPos; 9 | uniform vec3 objectColor; 10 | uniform vec3 lightColor; 11 | 12 | uniform float ambientStrength; 13 | uniform float specularStrength; 14 | uniform float specularShininess; 15 | 16 | void main() 17 | { 18 | //环境光 19 | vec3 ambient = ambientStrength * lightColor; 20 | //漫反射光 21 | vec3 norm = normalize(Normal); 22 | vec3 lightDir = normalize(lightPos - FragPos); 23 | float diff = max(dot(norm, lightDir), 0.0); 24 | vec3 diffuse = diff * lightColor; 25 | //镜面光 26 | vec3 viewDir = normalize(viewPos - FragPos); 27 | //reflect函数要求第一个向量是从光源指向片段位置的向量,但是lightDir当前正好相反,是从片段指向光源(由先前我们计算lightDir向量时,减法的顺序决定)。 28 | //为了保证我们得到正确的reflect向量,我们通过对lightDir向量取反来获得相反的方向。 29 | vec3 reflectDir = reflect(-lightDir, norm); 30 | float spec = pow(max(dot(viewDir, reflectDir), 0.0), specularShininess); 31 | vec3 specular = specularStrength * spec * lightColor; 32 | 33 | FragColor = vec4((ambient + diffuse + specular) * objectColor, 1.0); 34 | } 35 | -------------------------------------------------------------------------------- /src/2.lighting/2.2basic_lighting_specular/basic_lighting.vert: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | layout (location = 0) in vec3 aPos; 3 | layout (location = 1) in vec3 aNormal; 4 | 5 | out vec3 Normal; 6 | out vec3 FragPos; 7 | 8 | uniform mat4 model; 9 | uniform mat4 view; 10 | uniform mat4 projection; 11 | 12 | void main() 13 | { 14 | gl_Position = projection * view * model * vec4(aPos, 1.0); 15 | Normal = aNormal; 16 | FragPos = vec3(model * vec4(aPos, 1.0)); 17 | } 18 | -------------------------------------------------------------------------------- /src/2.lighting/2.3basic_lighting_exercise1/BasicLightingExercise1.h: -------------------------------------------------------------------------------- 1 | #ifndef BASICLIGHTINGEXERCISE1_H 2 | #define BASICLIGHTINGEXERCISE1_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include "../../utils/CameraUtil.h" 15 | 16 | class BasicLightingExercise1 : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core 17 | { 18 | Q_OBJECT 19 | public: 20 | Q_INVOKABLE BasicLightingExercise1(QWidget *parent = nullptr); 21 | ~BasicLightingExercise1(); 22 | protected: 23 | virtual void initializeGL() override; 24 | virtual void resizeGL(int w, int h) override; 25 | virtual void paintGL() override; 26 | 27 | virtual bool event(QEvent *e) override; 28 | 29 | private: 30 | void handleTimeout(); 31 | 32 | private: 33 | QOpenGLVertexArrayObject m_lightVAO; 34 | QOpenGLVertexArrayObject m_lightCubeVAO; 35 | QOpenGLBuffer m_VBO; 36 | 37 | QOpenGLShaderProgram m_lightShader; 38 | QOpenGLShaderProgram m_lightCubeShader; 39 | 40 | QVector3D m_lightPos; 41 | 42 | QMatrix4x4 m_projection; 43 | 44 | CameraUtil m_camera; 45 | 46 | QSlider* m_sliderAmbientStrength; 47 | QSlider* m_sliderSpecularStrength; 48 | QSlider* m_sliderSpecularShininess; 49 | 50 | QTimer m_timer; 51 | }; 52 | 53 | #endif // BASICLIGHTINGEXERCISE1_H 54 | -------------------------------------------------------------------------------- /src/2.lighting/2.5basic_lighting_exercise3/BasicLightingExercise3.h: -------------------------------------------------------------------------------- 1 | #ifndef BASICLIGHTINGEXERCISE3_H 2 | #define BASICLIGHTINGEXERCISE3_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include "../../utils/CameraUtil.h" 15 | 16 | class BasicLightingExercise3 : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core 17 | { 18 | Q_OBJECT 19 | public: 20 | Q_INVOKABLE BasicLightingExercise3(QWidget *parent = nullptr); 21 | ~BasicLightingExercise3(); 22 | protected: 23 | virtual void initializeGL() override; 24 | virtual void resizeGL(int w, int h) override; 25 | virtual void paintGL() override; 26 | 27 | virtual bool event(QEvent *e) override; 28 | 29 | private: 30 | void handleTimeout(); 31 | 32 | private: 33 | QOpenGLVertexArrayObject m_lightVAO; 34 | QOpenGLVertexArrayObject m_lightCubeVAO; 35 | QOpenGLBuffer m_VBO; 36 | 37 | QOpenGLShaderProgram m_lightShader; 38 | QOpenGLShaderProgram m_lightCubeShader; 39 | 40 | QVector3D m_lightPos; 41 | 42 | QMatrix4x4 m_projection; 43 | 44 | CameraUtil m_camera; 45 | 46 | QSlider* m_sliderAmbientStrength; 47 | QSlider* m_sliderSpecularStrength; 48 | QSlider* m_sliderSpecularShininess; 49 | 50 | QTimer m_timer; 51 | }; 52 | 53 | #endif // BASICLIGHTINGEXERCISE3_H 54 | -------------------------------------------------------------------------------- /src/2.lighting/2.5basic_lighting_exercise3/basic_lighting.frag: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | in vec3 Factor; 3 | out vec4 FragColor; 4 | 5 | uniform vec3 objectColor; 6 | 7 | void main() 8 | { 9 | FragColor = vec4(Factor * objectColor, 1.0); 10 | } 11 | 12 | -------------------------------------------------------------------------------- /src/2.lighting/2.5basic_lighting_exercise3/basic_lighting.vert: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | layout (location = 0) in vec3 aPos; 3 | layout (location = 1) in vec3 aNormal; 4 | 5 | out vec3 Factor; 6 | 7 | uniform mat4 model; 8 | uniform mat4 view; 9 | uniform mat4 projection; 10 | 11 | uniform vec3 viewPos; 12 | uniform vec3 lightPos; 13 | uniform vec3 lightColor; 14 | 15 | uniform float ambientStrength; 16 | uniform float specularStrength; 17 | uniform float specularShininess; 18 | 19 | void main() 20 | { 21 | //环境光 22 | vec3 ambient = ambientStrength * lightColor; 23 | //漫反射光 24 | vec3 norm = normalize(aNormal); 25 | vec3 FragPos = vec3(model * vec4(aPos, 1.0)); 26 | vec3 lightDir = normalize(lightPos - FragPos); 27 | float diff = max(dot(norm, lightDir), 0.0); 28 | vec3 diffuse = diff * lightColor; 29 | //镜面光 30 | vec3 viewDir = normalize(viewPos - FragPos); 31 | //reflect函数要求第一个向量是从光源指向片段位置的向量,但是lightDir当前正好相反,是从片段指向光源(由先前我们计算lightDir向量时,减法的顺序决定)。 32 | //为了保证我们得到正确的reflect向量,我们通过对lightDir向量取反来获得相反的方向。 33 | vec3 reflectDir = reflect(-lightDir, norm); 34 | float spec = pow(max(dot(viewDir, reflectDir), 0.0), specularShininess); 35 | vec3 specular = specularStrength * spec * lightColor; 36 | 37 | Factor = ambient + diffuse + specular; 38 | 39 | gl_Position = projection * view * model * vec4(aPos, 1.0); 40 | } 41 | -------------------------------------------------------------------------------- /src/2.lighting/3.1materials/Materials.h: -------------------------------------------------------------------------------- 1 | #ifndef MATERIALS_H 2 | #define MATERIALS_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include "../../utils/CameraUtil.h" 15 | 16 | class Materials : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core 17 | { 18 | Q_OBJECT 19 | public: 20 | Q_INVOKABLE Materials(QWidget *parent = nullptr); 21 | ~Materials(); 22 | protected: 23 | virtual void initializeGL() override; 24 | virtual void resizeGL(int w, int h) override; 25 | virtual void paintGL() override; 26 | 27 | virtual bool event(QEvent *e) override; 28 | 29 | private: 30 | void handleTimeout(); 31 | 32 | private: 33 | QOpenGLVertexArrayObject m_lightVAO; 34 | QOpenGLVertexArrayObject m_lightCubeVAO; 35 | QOpenGLBuffer m_VBO; 36 | 37 | QOpenGLShaderProgram m_lightShader; 38 | QOpenGLShaderProgram m_lightCubeShader; 39 | 40 | QVector3D m_lightPos; 41 | 42 | QVector3D m_lightColor; 43 | QVector3D m_diffuseColor; 44 | QVector3D m_ambientColor; 45 | 46 | QMatrix4x4 m_projection; 47 | 48 | CameraUtil m_camera; 49 | 50 | QTimer m_timer; 51 | }; 52 | 53 | #endif // MATERIALS_H 54 | -------------------------------------------------------------------------------- /src/2.lighting/3.1materials/materials.frag: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | struct Material{ 3 | vec3 ambient; 4 | vec3 diffuse; 5 | vec3 specular; 6 | float shininess; 7 | }; 8 | 9 | struct Light{ 10 | vec3 position; 11 | vec3 ambient; 12 | vec3 diffuse; 13 | vec3 specular; 14 | }; 15 | 16 | in vec3 Normal; 17 | in vec3 FragPos; 18 | 19 | out vec4 FragColor; 20 | 21 | uniform Material material; 22 | uniform Light light; 23 | 24 | uniform vec3 viewPos; 25 | 26 | void main() 27 | { 28 | //环境光 29 | vec3 ambient = material.ambient * light.ambient; 30 | //漫反射光 31 | vec3 norm = normalize(Normal); 32 | vec3 lightDir = normalize(light.position - FragPos); 33 | float diff = max(dot(norm, lightDir), 0.0); 34 | vec3 diffuse = diff * material.diffuse * light.diffuse; 35 | //镜面光 36 | vec3 viewDir = normalize(viewPos - FragPos); 37 | //reflect函数要求第一个向量是从光源指向片段位置的向量,但是lightDir当前正好相反,是从片段指向光源(由先前我们计算lightDir向量时,减法的顺序决定)。 38 | //为了保证我们得到正确的reflect向量,我们通过对lightDir向量取反来获得相反的方向。 39 | vec3 reflectDir = reflect(-lightDir, norm); 40 | float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess); 41 | vec3 specular = light.specular * material.specular * spec; 42 | 43 | FragColor = vec4(ambient + diffuse + specular, 1.0); 44 | } 45 | -------------------------------------------------------------------------------- /src/2.lighting/3.1materials/materials.vert: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | layout (location = 0) in vec3 aPos; 3 | layout (location = 1) in vec3 aNormal; 4 | 5 | out vec3 Normal; 6 | out vec3 FragPos; 7 | 8 | uniform mat4 model; 9 | uniform mat4 view; 10 | uniform mat4 projection; 11 | 12 | void main() 13 | { 14 | gl_Position = projection * view * model * vec4(aPos, 1.0); 15 | Normal = aNormal; 16 | FragPos = vec3(model * vec4(aPos, 1.0)); 17 | } 18 | -------------------------------------------------------------------------------- /src/2.lighting/4.1lighting_maps_diffuse_map/LightingMapsDiffuseMap.h: -------------------------------------------------------------------------------- 1 | #ifndef LIGHTINGMAPSDIFFUSEMAP_H 2 | #define LIGHTINGMAPSDIFFUSEMAP_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include "../../utils/CameraUtil.h" 15 | 16 | class LightingMapsDiffuseMap : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core 17 | { 18 | Q_OBJECT 19 | public: 20 | Q_INVOKABLE LightingMapsDiffuseMap(QWidget *parent = nullptr); 21 | ~LightingMapsDiffuseMap(); 22 | protected: 23 | virtual void initializeGL() override; 24 | virtual void resizeGL(int w, int h) override; 25 | virtual void paintGL() override; 26 | 27 | virtual bool event(QEvent *e) override; 28 | 29 | private: 30 | QOpenGLVertexArrayObject m_lightVAO; 31 | QOpenGLVertexArrayObject m_lightCubeVAO; 32 | QOpenGLBuffer m_VBO; 33 | 34 | QOpenGLShaderProgram m_lightShader; 35 | QOpenGLShaderProgram m_lightCubeShader; 36 | 37 | std::unique_ptr m_texture; 38 | 39 | QVector3D m_lightPos; 40 | 41 | QVector3D m_lightColor; 42 | QVector3D m_diffuseColor; 43 | QVector3D m_ambientColor; 44 | 45 | QMatrix4x4 m_projection; 46 | 47 | CameraUtil m_camera; 48 | }; 49 | 50 | #endif // LIGHTINGMAPSDIFFUSEMAP_H 51 | -------------------------------------------------------------------------------- /src/2.lighting/4.1lighting_maps_diffuse_map/lighting_maps_diffuse_map.frag: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | struct Material{ 3 | sampler2D diffuse; 4 | vec3 specular; 5 | float shininess; 6 | }; 7 | 8 | struct Light{ 9 | vec3 position; 10 | vec3 ambient; 11 | vec3 diffuse; 12 | vec3 specular; 13 | }; 14 | 15 | in vec2 TexCoords; 16 | in vec3 Normal; 17 | in vec3 FragPos; 18 | 19 | out vec4 FragColor; 20 | 21 | uniform Material material; 22 | uniform Light light; 23 | 24 | uniform vec3 viewPos; 25 | 26 | void main() 27 | { 28 | //环境光 29 | vec3 ambient = light.ambient * texture2D(material.diffuse, TexCoords).rgb; 30 | //漫反射光 31 | vec3 norm = normalize(Normal); 32 | vec3 lightDir = normalize(light.position - FragPos); 33 | float diff = max(dot(norm, lightDir), 0.0); 34 | vec3 diffuse = diff * light.diffuse * texture2D(material.diffuse, TexCoords).rgb; 35 | //镜面光 36 | vec3 viewDir = normalize(viewPos - FragPos); 37 | //reflect函数要求第一个向量是从光源指向片段位置的向量,但是lightDir当前正好相反,是从片段指向光源(由先前我们计算lightDir向量时,减法的顺序决定)。 38 | //为了保证我们得到正确的reflect向量,我们通过对lightDir向量取反来获得相反的方向。 39 | vec3 reflectDir = reflect(-lightDir, norm); 40 | float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess); 41 | vec3 specular = light.specular * material.specular * spec; 42 | 43 | FragColor = vec4(ambient + diffuse + specular, 1.0); 44 | } 45 | -------------------------------------------------------------------------------- /src/2.lighting/4.1lighting_maps_diffuse_map/lighting_maps_diffuse_map.vert: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | layout (location = 0) in vec3 aPos; 3 | layout (location = 1) in vec3 aNormal; 4 | layout (location = 2) in vec2 aTexCoords; 5 | 6 | out vec3 Normal; 7 | out vec3 FragPos; 8 | out vec2 TexCoords; 9 | 10 | uniform mat4 model; 11 | uniform mat4 view; 12 | uniform mat4 projection; 13 | 14 | void main() 15 | { 16 | gl_Position = projection * view * model * vec4(aPos, 1.0); 17 | Normal = aNormal; 18 | FragPos = vec3(model * vec4(aPos, 1.0)); 19 | TexCoords = aTexCoords; 20 | } 21 | -------------------------------------------------------------------------------- /src/2.lighting/4.2lighting_maps_specular_map/LightingMapsSpecularMap.h: -------------------------------------------------------------------------------- 1 | #ifndef LIGHTINGMAPSSPECULARMAP_H 2 | #define LIGHTINGMAPSSPECULARMAP_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include "../../utils/CameraUtil.h" 15 | 16 | class LightingMapsSpecularMap : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core 17 | { 18 | Q_OBJECT 19 | public: 20 | Q_INVOKABLE LightingMapsSpecularMap(QWidget *parent = nullptr); 21 | ~LightingMapsSpecularMap(); 22 | protected: 23 | virtual void initializeGL() override; 24 | virtual void resizeGL(int w, int h) override; 25 | virtual void paintGL() override; 26 | 27 | virtual bool event(QEvent *e) override; 28 | 29 | private: 30 | QOpenGLVertexArrayObject m_lightVAO; 31 | QOpenGLVertexArrayObject m_lightCubeVAO; 32 | QOpenGLBuffer m_VBO; 33 | 34 | QOpenGLShaderProgram m_lightShader; 35 | QOpenGLShaderProgram m_lightCubeShader; 36 | 37 | std::unique_ptr m_textureDiffuse; 38 | std::unique_ptr m_textureSpecular; 39 | 40 | QVector3D m_lightPos; 41 | 42 | QMatrix4x4 m_projection; 43 | 44 | CameraUtil m_camera; 45 | }; 46 | 47 | #endif // LIGHTINGMAPSSPECULARMAP_H 48 | -------------------------------------------------------------------------------- /src/2.lighting/4.2lighting_maps_specular_map/lighting_maps_specular_map.frag: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | struct Material{ 3 | sampler2D diffuse; 4 | sampler2D specular; 5 | float shininess; 6 | }; 7 | 8 | struct Light{ 9 | vec3 position; 10 | vec3 ambient; 11 | vec3 diffuse; 12 | vec3 specular; 13 | }; 14 | 15 | in vec2 TexCoords; 16 | in vec3 Normal; 17 | in vec3 FragPos; 18 | 19 | out vec4 FragColor; 20 | 21 | uniform Material material; 22 | uniform Light light; 23 | 24 | uniform vec3 viewPos; 25 | 26 | void main() 27 | { 28 | //环境光 29 | vec3 ambient = light.ambient * texture2D(material.diffuse, TexCoords).rgb; 30 | //漫反射光 31 | vec3 norm = normalize(Normal); 32 | vec3 lightDir = normalize(light.position - FragPos); 33 | float diff = max(dot(norm, lightDir), 0.0); 34 | vec3 diffuse = diff * light.diffuse * texture2D(material.diffuse, TexCoords).rgb; 35 | //镜面光 36 | vec3 viewDir = normalize(viewPos - FragPos); 37 | //reflect函数要求第一个向量是从光源指向片段位置的向量,但是lightDir当前正好相反,是从片段指向光源(由先前我们计算lightDir向量时,减法的顺序决定)。 38 | //为了保证我们得到正确的reflect向量,我们通过对lightDir向量取反来获得相反的方向。 39 | vec3 reflectDir = reflect(-lightDir, norm); 40 | float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess); 41 | vec3 specular = light.specular * spec * texture2D(material.specular, TexCoords).rgb; 42 | 43 | FragColor = vec4(ambient + diffuse + specular, 1.0); 44 | } 45 | -------------------------------------------------------------------------------- /src/2.lighting/4.2lighting_maps_specular_map/lighting_maps_specular_map.vert: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | layout (location = 0) in vec3 aPos; 3 | layout (location = 1) in vec3 aNormal; 4 | layout (location = 2) in vec2 aTexCoords; 5 | 6 | out vec3 Normal; 7 | out vec3 FragPos; 8 | out vec2 TexCoords; 9 | 10 | uniform mat4 model; 11 | uniform mat4 view; 12 | uniform mat4 projection; 13 | 14 | void main() 15 | { 16 | gl_Position = projection * view * model * vec4(aPos, 1.0); 17 | Normal = aNormal; 18 | FragPos = vec3(model * vec4(aPos, 1.0)); 19 | TexCoords = aTexCoords; 20 | } 21 | -------------------------------------------------------------------------------- /src/2.lighting/4.3lighting_maps_exercise2/LightingMapsExercise2.h: -------------------------------------------------------------------------------- 1 | #ifndef LIGHTINGMAPSEXERCISE2_H 2 | #define LIGHTINGMAPSEXERCISE2_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include "../../utils/CameraUtil.h" 15 | 16 | class LightingMapsExercise2 : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core 17 | { 18 | Q_OBJECT 19 | public: 20 | Q_INVOKABLE LightingMapsExercise2(QWidget *parent = nullptr); 21 | ~LightingMapsExercise2(); 22 | protected: 23 | virtual void initializeGL() override; 24 | virtual void resizeGL(int w, int h) override; 25 | virtual void paintGL() override; 26 | 27 | virtual bool event(QEvent *e) override; 28 | 29 | private: 30 | QOpenGLVertexArrayObject m_lightVAO; 31 | QOpenGLVertexArrayObject m_lightCubeVAO; 32 | QOpenGLBuffer m_VBO; 33 | 34 | QOpenGLShaderProgram m_lightShader; 35 | QOpenGLShaderProgram m_lightCubeShader; 36 | 37 | std::unique_ptr m_textureDiffuse; 38 | std::unique_ptr m_textureSpecular; 39 | 40 | QVector3D m_lightPos; 41 | 42 | QMatrix4x4 m_projection; 43 | 44 | CameraUtil m_camera; 45 | }; 46 | 47 | #endif // LIGHTINGMAPSEXERCISE2_H 48 | -------------------------------------------------------------------------------- /src/2.lighting/4.3lighting_maps_exercise2/lighting_maps_exercise2.frag: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | struct Material{ 3 | sampler2D diffuse; 4 | sampler2D specular; 5 | float shininess; 6 | }; 7 | 8 | struct Light{ 9 | vec3 position; 10 | vec3 ambient; 11 | vec3 diffuse; 12 | vec3 specular; 13 | }; 14 | 15 | in vec2 TexCoords; 16 | in vec3 Normal; 17 | in vec3 FragPos; 18 | 19 | out vec4 FragColor; 20 | 21 | uniform Material material; 22 | uniform Light light; 23 | 24 | uniform vec3 viewPos; 25 | 26 | void main() 27 | { 28 | //环境光 29 | vec3 ambient = light.ambient * texture2D(material.diffuse, TexCoords).rgb; 30 | //漫反射光 31 | vec3 norm = normalize(Normal); 32 | vec3 lightDir = normalize(light.position - FragPos); 33 | float diff = max(dot(norm, lightDir), 0.0); 34 | vec3 diffuse = diff * light.diffuse * texture2D(material.diffuse, TexCoords).rgb; 35 | //镜面光 36 | vec3 viewDir = normalize(viewPos - FragPos); 37 | //reflect函数要求第一个向量是从光源指向片段位置的向量,但是lightDir当前正好相反,是从片段指向光源(由先前我们计算lightDir向量时,减法的顺序决定)。 38 | //为了保证我们得到正确的reflect向量,我们通过对lightDir向量取反来获得相反的方向。 39 | vec3 reflectDir = reflect(-lightDir, norm); 40 | float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess); 41 | vec3 specular = light.specular * spec * (vec3(1.0) - vec3(texture2D(material.specular, TexCoords)));// here we inverse the sampled specular color. Black becomes white and white becomes black 42 | 43 | FragColor = vec4(ambient + diffuse + specular, 1.0); 44 | } 45 | -------------------------------------------------------------------------------- /src/2.lighting/4.3lighting_maps_exercise2/lighting_maps_exercise2.vert: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | layout (location = 0) in vec3 aPos; 3 | layout (location = 1) in vec3 aNormal; 4 | layout (location = 2) in vec2 aTexCoords; 5 | 6 | out vec3 Normal; 7 | out vec3 FragPos; 8 | out vec2 TexCoords; 9 | 10 | uniform mat4 model; 11 | uniform mat4 view; 12 | uniform mat4 projection; 13 | 14 | void main() 15 | { 16 | gl_Position = projection * view * model * vec4(aPos, 1.0); 17 | Normal = aNormal; 18 | FragPos = vec3(model * vec4(aPos, 1.0)); 19 | TexCoords = aTexCoords; 20 | } 21 | -------------------------------------------------------------------------------- /src/2.lighting/4.4lighting_maps_exercise4/LightingMapsExercise4.h: -------------------------------------------------------------------------------- 1 | #ifndef LIGHTINGMAPSEXERCISE4_H 2 | #define LIGHTINGMAPSEXERCISE4_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include "../../utils/CameraUtil.h" 15 | 16 | class LightingMapsExercise4 : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core 17 | { 18 | Q_OBJECT 19 | public: 20 | Q_INVOKABLE LightingMapsExercise4(QWidget *parent = nullptr); 21 | ~LightingMapsExercise4(); 22 | protected: 23 | virtual void initializeGL() override; 24 | virtual void resizeGL(int w, int h) override; 25 | virtual void paintGL() override; 26 | 27 | virtual bool event(QEvent *e) override; 28 | 29 | private: 30 | void handleTimeout(); 31 | 32 | private: 33 | QOpenGLVertexArrayObject m_lightVAO; 34 | QOpenGLVertexArrayObject m_lightCubeVAO; 35 | QOpenGLBuffer m_VBO; 36 | 37 | QOpenGLShaderProgram m_lightShader; 38 | QOpenGLShaderProgram m_lightCubeShader; 39 | 40 | std::unique_ptr m_textureDiffuse; 41 | std::unique_ptr m_textureSpecular; 42 | std::unique_ptr m_textureEmission; 43 | 44 | float m_matrixLight; 45 | float m_matrixMove; 46 | 47 | QVector3D m_lightPos; 48 | 49 | QMatrix4x4 m_projection; 50 | 51 | CameraUtil m_camera; 52 | 53 | QTimer m_timer; 54 | }; 55 | 56 | #endif // LIGHTINGMAPSEXERCISE4_H 57 | -------------------------------------------------------------------------------- /src/2.lighting/4.4lighting_maps_exercise4/lighting_maps_exercise4.frag: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | struct Material{ 3 | sampler2D diffuse; 4 | sampler2D specular; 5 | sampler2D emission; 6 | float shininess; 7 | }; 8 | 9 | struct Light{ 10 | vec3 position; 11 | vec3 ambient; 12 | vec3 diffuse; 13 | vec3 specular; 14 | }; 15 | 16 | in vec2 TexCoords; 17 | in vec3 Normal; 18 | in vec3 FragPos; 19 | 20 | out vec4 FragColor; 21 | 22 | uniform Material material; 23 | uniform Light light; 24 | 25 | uniform float matrixLight; 26 | uniform float matrixMove; 27 | 28 | uniform vec3 viewPos; 29 | 30 | void main() 31 | { 32 | //环境光 33 | vec3 ambient = light.ambient * texture2D(material.diffuse, TexCoords).rgb; 34 | //漫反射光 35 | vec3 norm = normalize(Normal); 36 | vec3 lightDir = normalize(light.position - FragPos); 37 | float diff = max(dot(norm, lightDir), 0.0); 38 | vec3 diffuse = diff * light.diffuse * texture2D(material.diffuse, TexCoords).rgb; 39 | //镜面光 40 | vec3 viewDir = normalize(viewPos - FragPos); 41 | //reflect函数要求第一个向量是从光源指向片段位置的向量,但是lightDir当前正好相反,是从片段指向光源(由先前我们计算lightDir向量时,减法的顺序决定)。 42 | //为了保证我们得到正确的reflect向量,我们通过对lightDir向量取反来获得相反的方向。 43 | vec3 reflectDir = reflect(-lightDir, norm); 44 | float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess); 45 | vec3 specular = light.specular * spec * texture2D(material.specular, TexCoords).rgb; 46 | // emission 47 | vec3 emission = vec3(matrixLight) * texture2D(material.emission, vec2(TexCoords.x, TexCoords.y + matrixMove)).rgb; 48 | 49 | FragColor = vec4(ambient + diffuse + specular + emission, 1.0); 50 | } 51 | -------------------------------------------------------------------------------- /src/2.lighting/4.4lighting_maps_exercise4/lighting_maps_exercise4.vert: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | layout (location = 0) in vec3 aPos; 3 | layout (location = 1) in vec3 aNormal; 4 | layout (location = 2) in vec2 aTexCoords; 5 | 6 | out vec3 Normal; 7 | out vec3 FragPos; 8 | out vec2 TexCoords; 9 | 10 | uniform mat4 model; 11 | uniform mat4 view; 12 | uniform mat4 projection; 13 | 14 | void main() 15 | { 16 | gl_Position = projection * view * model * vec4(aPos, 1.0); 17 | Normal = aNormal; 18 | FragPos = vec3(model * vec4(aPos, 1.0)); 19 | TexCoords = aTexCoords; 20 | } 21 | -------------------------------------------------------------------------------- /src/2.lighting/5.1light_casters_directional/LightCastersDirectional.h: -------------------------------------------------------------------------------- 1 | #ifndef LIGHTCASTERSDIRECTIONAL_H 2 | #define LIGHTCASTERSDIRECTIONAL_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include "../../utils/CameraUtil.h" 15 | 16 | class LightCastersDirectional : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core 17 | { 18 | Q_OBJECT 19 | public: 20 | Q_INVOKABLE LightCastersDirectional(QWidget *parent = nullptr); 21 | ~LightCastersDirectional(); 22 | protected: 23 | virtual void initializeGL() override; 24 | virtual void resizeGL(int w, int h) override; 25 | virtual void paintGL() override; 26 | 27 | virtual bool event(QEvent *e) override; 28 | 29 | private: 30 | void handleTimeout(); 31 | 32 | private: 33 | QOpenGLVertexArrayObject m_lightVAO; 34 | QOpenGLVertexArrayObject m_lightCubeVAO; 35 | QOpenGLBuffer m_VBO; 36 | 37 | QOpenGLShaderProgram m_lightShader; 38 | QOpenGLShaderProgram m_lightCubeShader; 39 | 40 | std::unique_ptr m_textureDiffuse; 41 | std::unique_ptr m_textureSpecular; 42 | std::unique_ptr m_textureEmission; 43 | 44 | float m_matrixLight; 45 | float m_matrixMove; 46 | 47 | QVector3D m_lightPos; 48 | 49 | QMatrix4x4 m_projection; 50 | 51 | std::vector m_cubePositions; 52 | std::vector m_models; 53 | 54 | CameraUtil m_camera; 55 | 56 | QTimer m_timer; 57 | }; 58 | 59 | #endif // LIGHTCASTERSDIRECTIONAL_H 60 | -------------------------------------------------------------------------------- /src/2.lighting/5.1light_casters_directional/light_casters_directional.frag: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | struct Material{ 3 | sampler2D diffuse; 4 | sampler2D specular; 5 | sampler2D emission; 6 | float shininess; 7 | }; 8 | 9 | struct Light{ 10 | //vec3 position;// 使用定向光就不再需要了 11 | vec3 direction; 12 | vec3 ambient; 13 | vec3 diffuse; 14 | vec3 specular; 15 | }; 16 | 17 | in vec2 TexCoords; 18 | in vec3 Normal; 19 | in vec3 FragPos; 20 | 21 | out vec4 FragColor; 22 | 23 | uniform Material material; 24 | uniform Light light; 25 | 26 | uniform float matrixLight; 27 | uniform float matrixMove; 28 | 29 | uniform vec3 viewPos; 30 | 31 | void main() 32 | { 33 | //环境光 34 | vec3 ambient = light.ambient * texture2D(material.diffuse, TexCoords).rgb; 35 | //漫反射光 36 | vec3 norm = normalize(Normal); 37 | vec3 lightDir = normalize(-light.direction); 38 | float diff = max(dot(norm, lightDir), 0.0); 39 | vec3 diffuse = diff * light.diffuse * texture2D(material.diffuse, TexCoords).rgb; 40 | //镜面光 41 | vec3 viewDir = normalize(viewPos - FragPos); 42 | //reflect函数要求第一个向量是从光源指向片段位置的向量,但是lightDir当前正好相反,是从片段指向光源(由先前我们计算lightDir向量时,减法的顺序决定)。 43 | //为了保证我们得到正确的reflect向量,我们通过对lightDir向量取反来获得相反的方向。 44 | vec3 reflectDir = reflect(-lightDir, norm); 45 | float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess); 46 | vec3 specular = light.specular * spec * texture2D(material.specular, TexCoords).rgb; 47 | // emission 48 | vec3 emission = vec3(matrixLight) * texture2D(material.emission, vec2(TexCoords.x, TexCoords.y + matrixMove)).rgb; 49 | 50 | FragColor = vec4(ambient + diffuse + specular + emission, 1.0); 51 | } 52 | -------------------------------------------------------------------------------- /src/2.lighting/5.1light_casters_directional/light_casters_directional.vert: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | layout (location = 0) in vec3 aPos; 3 | layout (location = 1) in vec3 aNormal; 4 | layout (location = 2) in vec2 aTexCoords; 5 | 6 | out vec3 Normal; 7 | out vec3 FragPos; 8 | out vec2 TexCoords; 9 | 10 | uniform mat4 model; 11 | uniform mat4 view; 12 | uniform mat4 projection; 13 | 14 | void main() 15 | { 16 | gl_Position = projection * view * model * vec4(aPos, 1.0); 17 | Normal = aNormal; 18 | FragPos = vec3(model * vec4(aPos, 1.0)); 19 | TexCoords = aTexCoords; 20 | } 21 | -------------------------------------------------------------------------------- /src/2.lighting/5.2light_casters_point/LightCastersPoint.h: -------------------------------------------------------------------------------- 1 | #ifndef LIGHTCASTERSPOINT_H 2 | #define LIGHTCASTERSPOINT_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include "../../utils/CameraUtil.h" 15 | 16 | class LightCastersPoint : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core 17 | { 18 | Q_OBJECT 19 | public: 20 | Q_INVOKABLE LightCastersPoint(QWidget *parent = nullptr); 21 | ~LightCastersPoint(); 22 | protected: 23 | virtual void initializeGL() override; 24 | virtual void resizeGL(int w, int h) override; 25 | virtual void paintGL() override; 26 | 27 | virtual bool event(QEvent *e) override; 28 | 29 | private: 30 | void handleTimeout(); 31 | 32 | private: 33 | QOpenGLVertexArrayObject m_lightVAO; 34 | QOpenGLVertexArrayObject m_lightCubeVAO; 35 | QOpenGLBuffer m_VBO; 36 | 37 | QOpenGLShaderProgram m_lightShader; 38 | QOpenGLShaderProgram m_lightCubeShader; 39 | 40 | std::unique_ptr m_textureDiffuse; 41 | std::unique_ptr m_textureSpecular; 42 | std::unique_ptr m_textureEmission; 43 | 44 | float m_matrixLight; 45 | float m_matrixMove; 46 | 47 | QVector3D m_lightPos; 48 | 49 | QMatrix4x4 m_projection; 50 | 51 | std::vector m_cubePositions; 52 | std::vector m_models; 53 | 54 | CameraUtil m_camera; 55 | 56 | QTimer m_timer; 57 | 58 | QSlider* m_sliderLightConstant; 59 | QSlider* m_sliderLightLinear; 60 | QSlider* m_sliderLightQuadratic; 61 | }; 62 | 63 | #endif // LIGHTCASTERSPOINT_H 64 | -------------------------------------------------------------------------------- /src/2.lighting/5.2light_casters_point/light_casters_point.frag: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | struct Material{ 3 | sampler2D diffuse; 4 | sampler2D specular; 5 | sampler2D emission; 6 | float shininess; 7 | }; 8 | 9 | struct Light{ 10 | vec3 position; 11 | 12 | vec3 ambient; 13 | vec3 diffuse; 14 | vec3 specular; 15 | //衰减 16 | float constant; 17 | float linear; 18 | float quadratic; 19 | }; 20 | 21 | in vec2 TexCoords; 22 | in vec3 Normal; 23 | in vec3 FragPos; 24 | 25 | out vec4 FragColor; 26 | 27 | uniform Material material; 28 | uniform Light light; 29 | 30 | uniform float matrixLight; 31 | uniform float matrixMove; 32 | 33 | uniform vec3 viewPos; 34 | 35 | void main() 36 | { 37 | //环境光 38 | vec3 ambient = light.ambient * texture2D(material.diffuse, TexCoords).rgb; 39 | //漫反射光 40 | vec3 norm = normalize(Normal); 41 | vec3 lightDir = normalize(light.position - FragPos); 42 | float diff = max(dot(norm, lightDir), 0.0); 43 | vec3 diffuse = diff * light.diffuse * texture2D(material.diffuse, TexCoords).rgb; 44 | //镜面光 45 | vec3 viewDir = normalize(viewPos - FragPos); 46 | //reflect函数要求第一个向量是从光源指向片段位置的向量,但是lightDir当前正好相反,是从片段指向光源(由先前我们计算lightDir向量时,减法的顺序决定)。 47 | //为了保证我们得到正确的reflect向量,我们通过对lightDir向量取反来获得相反的方向。 48 | vec3 reflectDir = reflect(-lightDir, norm); 49 | float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess); 50 | vec3 specular = light.specular * spec * texture2D(material.specular, TexCoords).rgb; 51 | // emission 52 | vec3 emission = vec3(matrixLight) * texture2D(material.emission, vec2(TexCoords.x, TexCoords.y + matrixMove)).rgb; 53 | // 衰减 54 | float distance = length(light.position - FragPos); 55 | float attenuation = 1.0 / (light.constant + light.linear * distance + light.quadratic * distance * distance); 56 | 57 | FragColor = vec4((ambient + diffuse + specular + emission) * attenuation, 1.0); 58 | } 59 | -------------------------------------------------------------------------------- /src/2.lighting/5.2light_casters_point/light_casters_point.vert: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | layout (location = 0) in vec3 aPos; 3 | layout (location = 1) in vec3 aNormal; 4 | layout (location = 2) in vec2 aTexCoords; 5 | 6 | out vec3 Normal; 7 | out vec3 FragPos; 8 | out vec2 TexCoords; 9 | 10 | uniform mat4 model; 11 | uniform mat4 view; 12 | uniform mat4 projection; 13 | 14 | void main() 15 | { 16 | gl_Position = projection * view * model * vec4(aPos, 1.0); 17 | Normal = aNormal; 18 | FragPos = vec3(model * vec4(aPos, 1.0)); 19 | TexCoords = aTexCoords; 20 | } 21 | -------------------------------------------------------------------------------- /src/2.lighting/5.3light_casters_spot/LightCastersSpot.h: -------------------------------------------------------------------------------- 1 | #ifndef LIGHTCASTERSSPOT_H 2 | #define LIGHTCASTERSSPOT_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include "../../utils/CameraUtil.h" 16 | 17 | class LightCastersSpot : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core 18 | { 19 | Q_OBJECT 20 | public: 21 | Q_INVOKABLE LightCastersSpot(QWidget *parent = nullptr); 22 | ~LightCastersSpot(); 23 | protected: 24 | virtual void initializeGL() override; 25 | virtual void resizeGL(int w, int h) override; 26 | virtual void paintGL() override; 27 | 28 | virtual bool event(QEvent *e) override; 29 | 30 | private: 31 | void handleTimeout(); 32 | 33 | private: 34 | QOpenGLVertexArrayObject m_lightVAO; 35 | QOpenGLVertexArrayObject m_lightCubeVAO; 36 | QOpenGLBuffer m_VBO; 37 | 38 | QOpenGLShaderProgram m_lightShader; 39 | QOpenGLShaderProgram m_lightCubeShader; 40 | 41 | std::unique_ptr m_textureDiffuse; 42 | std::unique_ptr m_textureSpecular; 43 | std::unique_ptr m_textureEmission; 44 | 45 | float m_matrixLight; 46 | float m_matrixMove; 47 | 48 | QVector3D m_lightPos; 49 | 50 | QMatrix4x4 m_projection; 51 | 52 | std::vector m_cubePositions; 53 | std::vector m_models; 54 | 55 | CameraUtil m_camera; 56 | 57 | QTimer m_timer; 58 | 59 | QSlider* m_sliderLightConstant; 60 | QSlider* m_sliderLightLinear; 61 | QSlider* m_sliderLightQuadratic; 62 | QSlider* m_sliderCutOff; 63 | QSlider* m_sliderOuterCutOff; 64 | 65 | QCheckBox* m_checkBox; 66 | }; 67 | 68 | #endif // LIGHTCASTERSSPOT_H 69 | -------------------------------------------------------------------------------- /src/2.lighting/5.3light_casters_spot/light_casters_spot.frag: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | struct Material{ 3 | sampler2D diffuse; 4 | sampler2D specular; 5 | sampler2D emission; 6 | float shininess; 7 | }; 8 | 9 | struct Light{ 10 | vec3 position; 11 | vec3 direction; 12 | float cutOff; 13 | float outerCutOff; 14 | 15 | vec3 ambient; 16 | vec3 diffuse; 17 | vec3 specular; 18 | //衰减 19 | float constant; 20 | float linear; 21 | float quadratic; 22 | }; 23 | 24 | in vec2 TexCoords; 25 | in vec3 Normal; 26 | in vec3 FragPos; 27 | 28 | out vec4 FragColor; 29 | 30 | uniform Material material; 31 | uniform Light light; 32 | 33 | uniform float matrixLight; 34 | uniform float matrixMove; 35 | 36 | uniform vec3 viewPos; 37 | 38 | void main() 39 | { 40 | //环境光 41 | vec3 ambient = light.ambient * texture2D(material.diffuse, TexCoords).rgb; 42 | //漫反射光 43 | vec3 norm = normalize(Normal); 44 | vec3 lightDir = normalize(light.position - FragPos); 45 | float diff = max(dot(norm, lightDir), 0.0); 46 | vec3 diffuse = diff * light.diffuse * texture2D(material.diffuse, TexCoords).rgb; 47 | //镜面光 48 | vec3 viewDir = normalize(viewPos - FragPos); 49 | //reflect函数要求第一个向量是从光源指向片段位置的向量,但是lightDir当前正好相反,是从片段指向光源(由先前我们计算lightDir向量时,减法的顺序决定)。 50 | //为了保证我们得到正确的reflect向量,我们通过对lightDir向量取反来获得相反的方向。 51 | vec3 reflectDir = reflect(-lightDir, norm); 52 | float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess); 53 | vec3 specular = light.specular * spec * texture2D(material.specular, TexCoords).rgb; 54 | // emission 55 | vec3 emission = vec3(matrixLight) * texture2D(material.emission, vec2(TexCoords.x, TexCoords.y + matrixMove)).rgb; 56 | // 衰减 57 | float distance = length(light.position - FragPos); 58 | float attenuation = 1.0 / (light.constant + light.linear * distance + light.quadratic * distance * distance); 59 | // spotlight 60 | float theta = dot(lightDir, normalize(-light.direction)); 61 | float epsilon = light.cutOff - light.outerCutOff; 62 | float intensity; 63 | //防止除0 64 | if(abs(epsilon) < 0.001){ 65 | intensity = theta > light.cutOff ? 1.0 : 0.0;//比较的是余弦值所以要 > 号 66 | }else{ 67 | intensity = clamp((theta - light.outerCutOff) / epsilon, 0.0, 1.0); 68 | } 69 | 70 | diffuse *= intensity; 71 | specular *= intensity; 72 | emission *= intensity; 73 | FragColor = vec4((ambient + diffuse + specular + emission) * attenuation, 1.0); 74 | } 75 | -------------------------------------------------------------------------------- /src/2.lighting/5.3light_casters_spot/light_casters_spot.vert: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | layout (location = 0) in vec3 aPos; 3 | layout (location = 1) in vec3 aNormal; 4 | layout (location = 2) in vec2 aTexCoords; 5 | 6 | out vec3 Normal; 7 | out vec3 FragPos; 8 | out vec2 TexCoords; 9 | 10 | uniform mat4 model; 11 | uniform mat4 view; 12 | uniform mat4 projection; 13 | 14 | void main() 15 | { 16 | gl_Position = projection * view * model * vec4(aPos, 1.0); 17 | Normal = aNormal; 18 | FragPos = vec3(model * vec4(aPos, 1.0)); 19 | TexCoords = aTexCoords; 20 | } 21 | -------------------------------------------------------------------------------- /src/2.lighting/6.1multiple_lights/MultipleLights.h: -------------------------------------------------------------------------------- 1 | #ifndef MULTIPLELIGHTS_H 2 | #define MULTIPLELIGHTS_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include "../../utils/CameraUtil.h" 17 | 18 | class MultipleLights : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core 19 | { 20 | Q_OBJECT 21 | public: 22 | Q_INVOKABLE MultipleLights(QWidget *parent = nullptr); 23 | ~MultipleLights(); 24 | protected: 25 | virtual void initializeGL() override; 26 | virtual void resizeGL(int w, int h) override; 27 | virtual void paintGL() override; 28 | 29 | virtual bool event(QEvent *e) override; 30 | 31 | private: 32 | void handleRadio(); 33 | 34 | private: 35 | QOpenGLVertexArrayObject m_lightVAO; 36 | QOpenGLVertexArrayObject m_lightCubeVAO; 37 | QOpenGLBuffer m_VBO; 38 | 39 | QOpenGLShaderProgram m_lightShader; 40 | QOpenGLShaderProgram m_lightCubeShader; 41 | 42 | std::unique_ptr m_textureDiffuse; 43 | std::unique_ptr m_textureSpecular; 44 | 45 | QVector3D m_lightPos; 46 | 47 | QMatrix4x4 m_projection; 48 | 49 | std::vector m_pointLightPositions; 50 | std::vector m_cubePositions; 51 | std::vector m_models; 52 | 53 | CameraUtil m_camera; 54 | 55 | QRadioButton* m_radioButtons[5]; 56 | 57 | //styles 58 | struct DirLight { 59 | QVector3D direction; 60 | 61 | QVector3D ambient; 62 | QVector3D diffuse; 63 | QVector3D specular; 64 | }; 65 | 66 | struct PointLight { 67 | QVector3D position; 68 | 69 | float constant; 70 | float linear; 71 | float quadratic; 72 | 73 | QVector3D ambient; 74 | QVector3D diffuse; 75 | QVector3D specular; 76 | }; 77 | 78 | struct SpotLight { 79 | QVector3D position; 80 | QVector3D direction; 81 | float cutOff; 82 | float outerCutOff; 83 | 84 | float constant; 85 | float linear; 86 | float quadratic; 87 | 88 | QVector3D ambient; 89 | QVector3D diffuse; 90 | QVector3D specular; 91 | }; 92 | 93 | QVector4D m_backgroundColor; 94 | DirLight m_dirLight; 95 | SpotLight m_spotLight; 96 | std::vector m_pointLightColors; 97 | std::vector m_pointLightValues; 98 | }; 99 | 100 | #endif // MULTIPLELIGHTS_H 101 | -------------------------------------------------------------------------------- /src/2.lighting/6.1multiple_lights/light_cube.frag: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | out vec4 FragColor; 3 | 4 | uniform vec3 lightColor; 5 | 6 | void main() 7 | { 8 | FragColor = vec4(lightColor, 1.0); 9 | } 10 | -------------------------------------------------------------------------------- /src/2.lighting/6.1multiple_lights/light_cube.vert: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | layout (location = 0) in vec3 aPos; 3 | 4 | uniform mat4 model; 5 | uniform mat4 view; 6 | uniform mat4 projection; 7 | 8 | void main() 9 | { 10 | gl_Position = projection * view * model * vec4(aPos, 1.0); 11 | } 12 | -------------------------------------------------------------------------------- /src/2.lighting/6.1multiple_lights/multiple_lights.vert: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | layout (location = 0) in vec3 aPos; 3 | layout (location = 1) in vec3 aNormal; 4 | layout (location = 2) in vec2 aTexCoords; 5 | 6 | out vec3 Normal; 7 | out vec3 FragPos; 8 | out vec2 TexCoords; 9 | 10 | uniform mat4 model; 11 | uniform mat4 view; 12 | uniform mat4 projection; 13 | 14 | void main() 15 | { 16 | gl_Position = projection * view * model * vec4(aPos, 1.0); 17 | Normal = aNormal; 18 | FragPos = vec3(model * vec4(aPos, 1.0)); 19 | TexCoords = aTexCoords; 20 | } 21 | -------------------------------------------------------------------------------- /src/3.model_loading/1.model_loading/ModelLoading.h: -------------------------------------------------------------------------------- 1 | #ifndef MODELLOADING_H 2 | #define MODELLOADING_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include "../../utils/CameraUtil.h" 17 | #include "../../utils/ModelUtil.h" 18 | 19 | class ModelLoading : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core 20 | { 21 | Q_OBJECT 22 | public: 23 | Q_INVOKABLE ModelLoading(QWidget *parent = nullptr); 24 | ~ModelLoading(); 25 | protected: 26 | virtual void initializeGL() override; 27 | virtual void resizeGL(int w, int h) override; 28 | virtual void paintGL() override; 29 | 30 | virtual bool event(QEvent *e) override; 31 | 32 | private: 33 | void handleRadio(); 34 | 35 | private: 36 | QOpenGLVertexArrayObject m_lightVAO; 37 | QOpenGLVertexArrayObject m_lightCubeVAO; 38 | QOpenGLBuffer m_VBO; 39 | 40 | QOpenGLShaderProgram m_lightShader; 41 | QOpenGLShaderProgram m_lightCubeShader; 42 | 43 | std::unique_ptr m_textureDiffuse; 44 | std::unique_ptr m_textureSpecular; 45 | 46 | QVector3D m_lightPos; 47 | 48 | QMatrix4x4 m_projection; 49 | 50 | std::vector m_pointLightPositions; 51 | std::vector m_cubePositions; 52 | std::vector m_models; 53 | 54 | CameraUtil m_camera; 55 | 56 | std::unique_ptr m_model; 57 | 58 | QRadioButton* m_radioButtons[5]; 59 | 60 | //styles 61 | struct DirLight { 62 | QVector3D direction; 63 | 64 | QVector3D ambient; 65 | QVector3D diffuse; 66 | QVector3D specular; 67 | }; 68 | 69 | struct PointLight { 70 | QVector3D position; 71 | 72 | float constant; 73 | float linear; 74 | float quadratic; 75 | 76 | QVector3D ambient; 77 | QVector3D diffuse; 78 | QVector3D specular; 79 | }; 80 | 81 | struct SpotLight { 82 | QVector3D position; 83 | QVector3D direction; 84 | float cutOff; 85 | float outerCutOff; 86 | 87 | float constant; 88 | float linear; 89 | float quadratic; 90 | 91 | QVector3D ambient; 92 | QVector3D diffuse; 93 | QVector3D specular; 94 | }; 95 | 96 | QVector4D m_backgroundColor; 97 | DirLight m_dirLight; 98 | SpotLight m_spotLight; 99 | std::vector m_pointLightColors; 100 | std::vector m_pointLightValues; 101 | }; 102 | 103 | #endif // MODELLOADING_H 104 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/1.1depth_testing/DepthTesting.h: -------------------------------------------------------------------------------- 1 | #ifndef DEPTHTESTING_H 2 | #define DEPTHTESTING_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include "../../utils/CameraUtil.h" 14 | 15 | class DepthTesting : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core 16 | { 17 | Q_OBJECT 18 | public: 19 | Q_INVOKABLE DepthTesting(QWidget *parent = nullptr); 20 | ~DepthTesting(); 21 | protected: 22 | virtual void initializeGL() override; 23 | virtual void resizeGL(int w, int h) override; 24 | virtual void paintGL() override; 25 | virtual bool event(QEvent *e) override; 26 | 27 | private: 28 | QOpenGLVertexArrayObject m_cubeVAO, m_planeVAO; 29 | QOpenGLBuffer m_cubeVBO, m_planeVBO; 30 | 31 | QOpenGLShaderProgram m_program; 32 | 33 | std::unique_ptr m_texture[2]; 34 | 35 | QMatrix4x4 m_model; 36 | QMatrix4x4 m_view; 37 | QMatrix4x4 m_projection; 38 | 39 | CameraUtil m_camera; 40 | 41 | bool m_depthViewEnabled; 42 | }; 43 | 44 | #endif // DEPTHTESTING_H 45 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/1.1depth_testing/depth_testing.frag: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | out vec4 FragColor; 3 | 4 | in vec2 TexCoords; 5 | 6 | uniform sampler2D texture1; 7 | 8 | void main() 9 | { 10 | FragColor = texture2D(texture1, TexCoords); 11 | } 12 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/1.1depth_testing/depth_testing.vert: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | layout (location = 0) in vec3 aPos; 3 | layout (location = 1) in vec2 aTexCoords; 4 | 5 | out vec2 TexCoords; 6 | 7 | uniform mat4 model; 8 | uniform mat4 view; 9 | uniform mat4 projection; 10 | 11 | void main() 12 | { 13 | TexCoords = aTexCoords; 14 | gl_Position = projection * view * model * vec4(aPos, 1.0); 15 | } 16 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/1.1depth_testing/depth_testing_view.frag: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | out vec4 FragColor; 3 | 4 | float near = 0.1; 5 | float far = 100.0; 6 | 7 | float LinearizeDepth(float depth) 8 | { 9 | float z = depth * 2.0 - 1.0; // to NDC 10 | return (2.0 * near * far) / (far + near - z * (far - near)); 11 | } 12 | 13 | void main() 14 | { 15 | float depth = LinearizeDepth(gl_FragCoord.z) / far; // divide by far to get depth in range [0,1] for visualization purposes 16 | FragColor = vec4(vec3(depth), 1.0); 17 | } 18 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/10.1instancing_quads/InstancingQuads.cpp: -------------------------------------------------------------------------------- 1 | #include "InstancingQuads.h" 2 | 3 | #include 4 | 5 | InstancingQuads::InstancingQuads(QWidget *parent) 6 | : QOpenGLWidget(parent), 7 | m_camera(this) 8 | { 9 | } 10 | 11 | InstancingQuads::~InstancingQuads() 12 | { 13 | makeCurrent(); 14 | 15 | doneCurrent(); 16 | } 17 | 18 | void InstancingQuads::initializeGL() 19 | { 20 | if(!context()){ 21 | qCritical() << "Cant't get OpenGL contex"; 22 | close(); 23 | return; 24 | } 25 | initializeOpenGLFunctions(); 26 | 27 | QOpenGLDebugLogger *logger = new QOpenGLDebugLogger(this); 28 | logger->initialize(); // initializes in the current context, i.e. ctx 29 | connect(logger, &QOpenGLDebugLogger::messageLogged, this, &InstancingQuads::handleLoggedMessage); 30 | logger->startLogging(); 31 | 32 | 33 | glEnable(GL_DEPTH_TEST); 34 | glDepthFunc(GL_LESS); 35 | 36 | //shader初始化 37 | { 38 | m_shader = std::make_unique(":/4.advanced_opengl/10.1instancing_quads/instancing.vert", 39 | ":/4.advanced_opengl/10.1instancing_quads/instancing.frag"); 40 | } 41 | { 42 | // note : vector>(100, vector(2)) is wrong 43 | // because vector of vectors are not stored contiguously 44 | std::vector translations(100 * 2); 45 | int index = 0; 46 | GLfloat offset = 0.1f; 47 | for (int i = -10; i < 10; i += 2) { 48 | for (int j = -10; j < 10; j += 2) { 49 | translations[index++] = i / 10.0f + offset; 50 | translations[index++] = j / 10.0f + offset; 51 | } 52 | } 53 | m_instanceVBO.create(); 54 | m_instanceVBO.bind(); 55 | m_instanceVBO.allocate(translations.data(), translations.size() * sizeof(GLfloat)); 56 | m_instanceVBO.release(); 57 | 58 | float quadVertices[] = { 59 | // positions // colors 60 | -0.05f, 0.05f, 1.0f, 0.0f, 0.0f, 61 | 0.05f, -0.05f, 0.0f, 1.0f, 0.0f, 62 | -0.05f, -0.05f, 0.0f, 0.0f, 1.0f, 63 | 64 | -0.05f, 0.05f, 1.0f, 0.0f, 0.0f, 65 | 0.05f, -0.05f, 0.0f, 1.0f, 0.0f, 66 | 0.05f, 0.05f, 0.0f, 1.0f, 1.0f 67 | }; 68 | m_quadVAO.create(); 69 | m_quadVAO.bind(); 70 | m_quadVBO.create(); 71 | m_quadVBO.bind(); 72 | m_quadVBO.allocate(quadVertices, sizeof(quadVertices)); 73 | m_shader->enableAttributeArray(0); 74 | m_shader->setAttributeBuffer(0, GL_FLOAT, 0, 2, sizeof(GLfloat) * 5); 75 | m_shader->enableAttributeArray(1); 76 | m_shader->setAttributeBuffer(1, GL_FLOAT, sizeof(GLfloat) * 2, 3, sizeof(GLfloat) * 5); 77 | // also set instance data 78 | m_instanceVBO.bind(); 79 | m_shader->enableAttributeArray(2); 80 | m_shader->setAttributeBuffer(2, GL_FLOAT, 0, 2, 2 * sizeof(GLfloat)); // 另一个VBO的 81 | m_instanceVBO.release(); 82 | glVertexAttribDivisor(2, 1); // tell OpenGL this is an instanced vertex attribute. 83 | } 84 | // 相机类初始化 85 | m_camera.init(); 86 | } 87 | 88 | void InstancingQuads::resizeGL(int w, int h) 89 | { 90 | glViewport(0, 0, w, h); 91 | } 92 | 93 | void InstancingQuads::paintGL() 94 | { 95 | glClearColor(0.1f, 0.1f, 0.1f, 1.0f); 96 | glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 97 | 98 | m_shader->bind(); 99 | m_quadVAO.bind(); 100 | glDrawArraysInstanced(GL_TRIANGLES, 0, 6, 100); 101 | m_quadVAO.release(); 102 | m_shader->release(); 103 | } 104 | 105 | bool InstancingQuads::event(QEvent *e) 106 | { 107 | m_camera.handle(e); 108 | return QWidget::event(e); 109 | } 110 | 111 | void InstancingQuads::handleLoggedMessage(const QOpenGLDebugMessage &debugMessage) 112 | { 113 | qDebug() << debugMessage.message(); 114 | } 115 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/10.1instancing_quads/InstancingQuads.h: -------------------------------------------------------------------------------- 1 | #ifndef INSTANCINGQUADS_H 2 | #define INSTANCINGQUADS_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include "Config.h" 15 | #include "../../utils/ModelUtil.h" 16 | #include "../../utils/CameraUtil.h" 17 | #include "../../utils/ShaderUtil.h" 18 | #include "../../utils/OpenGLUniformbufferObject.h" 19 | 20 | class InstancingQuads : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core 21 | { 22 | Q_OBJECT 23 | public: 24 | Q_INVOKABLE InstancingQuads(QWidget *parent = nullptr); 25 | ~InstancingQuads(); 26 | protected: 27 | virtual void initializeGL() override; 28 | virtual void resizeGL(int w, int h) override; 29 | virtual void paintGL() override; 30 | virtual bool event(QEvent *e) override; 31 | 32 | private: 33 | void handleLoggedMessage(const QOpenGLDebugMessage &debugMessage); 34 | 35 | private: 36 | QOpenGLVertexArrayObject m_quadVAO; 37 | QOpenGLBuffer m_quadVBO, m_instanceVBO; 38 | std::unique_ptr m_shader; 39 | 40 | CameraUtil m_camera; 41 | }; 42 | 43 | #endif // INSTANCINGQUADS_H 44 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/10.1instancing_quads/instancing.frag: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | out vec4 FragColor; 3 | 4 | in vec3 fColor; 5 | 6 | void main() 7 | { 8 | FragColor = vec4(fColor, 1.0); 9 | } 10 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/10.1instancing_quads/instancing.vert: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | layout (location = 0) in vec2 aPos; 3 | layout (location = 1) in vec3 aColor; 4 | layout (location = 2) in vec2 aOffset; 5 | 6 | out vec3 fColor; 7 | 8 | void main() 9 | { 10 | fColor = aColor; 11 | gl_Position = vec4(aPos * gl_InstanceID / 100.0 + aOffset, 0.0, 1.0); 12 | } 13 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/10.2asteroids/Asteroids.cpp: -------------------------------------------------------------------------------- 1 | #include "Asteroids.h" 2 | 3 | #include 4 | 5 | Asteroids::Asteroids(QWidget *parent) 6 | : QOpenGLWidget(parent), 7 | m_camera(this) 8 | { 9 | qsrand(QTime::currentTime().msecsSinceStartOfDay()); 10 | } 11 | 12 | Asteroids::~Asteroids() 13 | { 14 | makeCurrent(); 15 | m_modelPlanet->destory(); 16 | m_modelRock->destory(); 17 | doneCurrent(); 18 | } 19 | 20 | void Asteroids::initializeGL() 21 | { 22 | if(!context()){ 23 | qCritical() << "Cant't get OpenGL contex"; 24 | close(); 25 | return; 26 | } 27 | initializeOpenGLFunctions(); 28 | 29 | QOpenGLDebugLogger *logger = new QOpenGLDebugLogger(this); 30 | logger->initialize(); // initializes in the current context, i.e. ctx 31 | connect(logger, &QOpenGLDebugLogger::messageLogged, this, &Asteroids::handleLoggedMessage); 32 | logger->startLogging(); 33 | 34 | 35 | glEnable(GL_DEPTH_TEST); 36 | glDepthFunc(GL_LESS); 37 | 38 | //shader初始化 39 | { 40 | m_shader = std::make_unique(":/4.advanced_opengl/10.2asteroids/asteroids.vert", 41 | ":/4.advanced_opengl/10.2asteroids/asteroids.frag"); 42 | } 43 | // load model 44 | { 45 | m_modelPlanet = std::make_unique(QString("%1%2").arg(STR_SRC_PATH).arg("/resources/objects/planet/planet.obj"), context()); 46 | m_modelRock = std::make_unique(QString("%1%2").arg(STR_SRC_PATH).arg("/resources/objects/rock/rock.obj"), context()); 47 | } 48 | // model matrices 49 | { 50 | int n = 5000; 51 | m_modelMatrices.resize(n); 52 | float radius = 50.0f; 53 | float offset = 2.5f; 54 | for (int i = 0; i < n; ++i) { 55 | QMatrix4x4 model; 56 | // 1. 位移:分布在半径为 'radius' 的圆形上,偏移的范围是 [-offset, offset] 57 | float angle = i * 360.0f / n; 58 | float displacement = (qrand() % static_cast(2 * offset * 100)) / 100.0f - offset; 59 | float x = sin(angle) * radius + displacement; 60 | displacement = (qrand() % static_cast(2 * offset * 100)) / 100.0f - offset; 61 | float y = displacement * 0.4f; // 让行星带的高度比x和z的宽度要小 62 | displacement = (qrand() % static_cast(2 * offset * 100)) / 100.0f - offset; 63 | float z = cos(angle) * radius + displacement; 64 | model.translate(x, y, z); 65 | // 2.缩放 66 | float scale = (qrand() % 20) / 100.0f + 0.05; 67 | model.scale(scale); 68 | // 3. 旋转:绕着一个(半)随机选择的旋转轴向量进行随机的旋转 69 | float rotAngle = (qrand() % 360); 70 | model.rotate(rotAngle, QVector3D(0.4f, 0.6f, 0.8f)); 71 | // 4. 添加到数组中 72 | m_modelMatrices[i] = model; 73 | } 74 | } 75 | // 相机类初始化 76 | m_camera.init(); 77 | m_camera.setCameraPos({0.0f, 0.0f, 55.0f}); 78 | } 79 | 80 | void Asteroids::resizeGL(int w, int h) 81 | { 82 | glViewport(0, 0, w, h); 83 | } 84 | 85 | void Asteroids::paintGL() 86 | { 87 | glClearColor(0.1f, 0.1f, 0.1f, 1.0f); 88 | glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 89 | 90 | m_shader->bind(); 91 | // mvp 92 | // if use ```QMatrix4x4 projection;```, the projection will not be a identity 93 | auto projection = QMatrix4x4(); 94 | projection.perspective(m_camera.getFov(), 1.0 * width() / height(), 0.1f, 100.0f); 95 | m_shader->setUniformValue("projection", projection); 96 | m_shader->setUniformValue("view", m_camera.getViewMatrix()); 97 | // draw planet 98 | auto model = QMatrix4x4();//m_modelPlanet->getNDCMatrix(); 99 | model.translate(0.0f, -3.0f, 0.0f); 100 | model.scale(4.0f); 101 | m_shader->setUniformValue("model", model); 102 | m_modelPlanet->Draw(m_shader.get()); 103 | // draw meteorites 104 | for (auto& i : m_modelMatrices) { 105 | m_shader->setUniformValue("model", i); 106 | m_modelRock->Draw(m_shader.get()); 107 | } 108 | m_shader->release(); 109 | } 110 | 111 | bool Asteroids::event(QEvent *e) 112 | { 113 | m_camera.handle(e); 114 | return QWidget::event(e); 115 | } 116 | 117 | void Asteroids::handleLoggedMessage(const QOpenGLDebugMessage &debugMessage) 118 | { 119 | qDebug() << debugMessage.message(); 120 | } 121 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/10.2asteroids/Asteroids.h: -------------------------------------------------------------------------------- 1 | #ifndef ASTEROIDS_H 2 | #define ASTEROIDS_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include "Config.h" 15 | #include "../../utils/ModelUtil.h" 16 | #include "../../utils/CameraUtil.h" 17 | #include "../../utils/ShaderUtil.h" 18 | #include "../../utils/OpenGLUniformbufferObject.h" 19 | 20 | class Asteroids : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core 21 | { 22 | Q_OBJECT 23 | public: 24 | Q_INVOKABLE Asteroids(QWidget *parent = nullptr); 25 | ~Asteroids(); 26 | protected: 27 | virtual void initializeGL() override; 28 | virtual void resizeGL(int w, int h) override; 29 | virtual void paintGL() override; 30 | virtual bool event(QEvent *e) override; 31 | 32 | private: 33 | void handleLoggedMessage(const QOpenGLDebugMessage &debugMessage); 34 | 35 | private: 36 | std::unique_ptr m_shader; 37 | 38 | std::unique_ptr m_modelPlanet; 39 | std::unique_ptr m_modelRock; 40 | 41 | std::vector m_modelMatrices; 42 | 43 | CameraUtil m_camera; 44 | }; 45 | 46 | #endif // ASTEROIDS_H 47 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/10.2asteroids/asteroids.frag: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | out vec4 FragColor; 3 | 4 | in vec2 TexCoords; 5 | 6 | uniform sampler2D texture_diffuse1; 7 | 8 | void main() 9 | { 10 | FragColor = texture(texture_diffuse1, TexCoords); 11 | } 12 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/10.2asteroids/asteroids.vert: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | layout (location = 0) in vec3 aPos; //ModelUtil class : location : 0-position, 1-normal, 2-texture 3 | layout (location = 2) in vec2 aTexCoords; // location needs to be 2 4 | 5 | out vec2 TexCoords; 6 | 7 | uniform mat4 projection; 8 | uniform mat4 view; 9 | uniform mat4 model; 10 | 11 | void main() 12 | { 13 | TexCoords = aTexCoords; 14 | gl_Position = projection * view * model * vec4(aPos, 1.0f); 15 | } 16 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/10.3asteroids_instanced/AsteroidsInstanced.h: -------------------------------------------------------------------------------- 1 | #ifndef ASTEROIDSINSTANCED_H 2 | #define ASTEROIDSINSTANCED_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include "Config.h" 15 | #include "../../utils/ModelUtil.h" 16 | #include "../../utils/CameraUtil.h" 17 | #include "../../utils/ShaderUtil.h" 18 | #include "../../utils/OpenGLUniformbufferObject.h" 19 | 20 | class AsteroidsInstanced : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core 21 | { 22 | Q_OBJECT 23 | public: 24 | Q_INVOKABLE AsteroidsInstanced(QWidget *parent = nullptr); 25 | ~AsteroidsInstanced(); 26 | protected: 27 | virtual void initializeGL() override; 28 | virtual void resizeGL(int w, int h) override; 29 | virtual void paintGL() override; 30 | virtual bool event(QEvent *e) override; 31 | 32 | private: 33 | void handleLoggedMessage(const QOpenGLDebugMessage &debugMessage); 34 | 35 | private: 36 | QOpenGLBuffer m_VBO; 37 | std::unique_ptr m_shader; 38 | std::unique_ptr m_rockShader; 39 | 40 | std::unique_ptr m_modelPlanet; 41 | std::unique_ptr m_modelRock; 42 | 43 | struct mat4 44 | { 45 | float m11; 46 | float m12; 47 | float m13; 48 | float m14; 49 | float m21; 50 | float m22; 51 | float m23; 52 | float m24; 53 | float m31; 54 | float m32; 55 | float m33; 56 | float m34; 57 | float m41; 58 | float m42; 59 | float m43; 60 | float m44; 61 | }; 62 | std::vector m_modelMatrices; 63 | 64 | CameraUtil m_camera; 65 | }; 66 | 67 | #endif // ASTEROIDSINSTANCED_H 68 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/10.3asteroids_instanced/asteroids.frag: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | out vec4 FragColor; 3 | 4 | in vec2 TexCoords; 5 | 6 | uniform sampler2D texture_diffuse1; 7 | 8 | void main() 9 | { 10 | FragColor = texture(texture_diffuse1, TexCoords); 11 | } 12 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/10.3asteroids_instanced/asteroids.vert: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | layout (location = 0) in vec3 aPos; 3 | layout (location = 2) in vec2 aTexCoords; 4 | layout (location = 3) in mat4 aInstanceMatrix; 5 | 6 | out vec2 TexCoords; 7 | 8 | uniform mat4 projection; 9 | uniform mat4 view; 10 | 11 | void main() 12 | { 13 | TexCoords = aTexCoords; 14 | gl_Position = projection * view * aInstanceMatrix * vec4(aPos, 1.0f); 15 | } 16 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/10.3asteroids_instanced/planet.frag: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | out vec4 FragColor; 3 | 4 | in vec2 TexCoords; 5 | 6 | uniform sampler2D texture_diffuse1; 7 | 8 | void main() 9 | { 10 | FragColor = texture(texture_diffuse1, TexCoords) * vec4(1.0, 0.0, 0.0, 1.0); 11 | } 12 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/10.3asteroids_instanced/planet.vert: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | layout (location = 0) in vec3 aPos; 3 | layout (location = 2) in vec2 aTexCoords; 4 | 5 | out vec2 TexCoords; 6 | 7 | uniform mat4 projection; 8 | uniform mat4 view; 9 | uniform mat4 model; 10 | 11 | void main() 12 | { 13 | TexCoords = aTexCoords; 14 | gl_Position = projection * view * model * vec4(aPos, 1.0f); 15 | } 16 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/2.stencil_testing/StencilTesting.h: -------------------------------------------------------------------------------- 1 | #ifndef STENCILTESTING_H 2 | #define STENCILTESTING_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include "../../utils/CameraUtil.h" 14 | 15 | class StencilTesting : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core 16 | { 17 | Q_OBJECT 18 | public: 19 | Q_INVOKABLE StencilTesting(QWidget *parent = nullptr); 20 | ~StencilTesting(); 21 | protected: 22 | virtual void initializeGL() override; 23 | virtual void resizeGL(int w, int h) override; 24 | virtual void paintGL() override; 25 | virtual bool event(QEvent *e) override; 26 | 27 | private: 28 | QOpenGLVertexArrayObject m_cubeVAO, m_planeVAO; 29 | QOpenGLBuffer m_cubeVBO, m_planeVBO; 30 | 31 | QOpenGLShaderProgram m_normalShader; 32 | QOpenGLShaderProgram m_singleColorShader; 33 | 34 | std::unique_ptr m_texture[2]; 35 | 36 | QMatrix4x4 m_model; 37 | QMatrix4x4 m_view; 38 | QMatrix4x4 m_projection; 39 | 40 | CameraUtil m_camera; 41 | }; 42 | 43 | #endif // STENCILTESTING_H 44 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/2.stencil_testing/stencil_single_color.frag: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | out vec4 FragColor; 3 | 4 | void main() 5 | { 6 | FragColor = vec4(0.04, 0.28, 0.26, 1.0); 7 | } 8 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/2.stencil_testing/stencil_testing.frag: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | out vec4 FragColor; 3 | 4 | in vec2 TexCoords; 5 | 6 | uniform sampler2D texture1; 7 | 8 | void main() 9 | { 10 | FragColor = texture2D(texture1, TexCoords); 11 | } 12 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/2.stencil_testing/stencil_testing.vert: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | layout (location = 0) in vec3 aPos; 3 | layout (location = 1) in vec2 aTexCoords; 4 | 5 | out vec2 TexCoords; 6 | 7 | uniform mat4 model; 8 | uniform mat4 view; 9 | uniform mat4 projection; 10 | 11 | void main() 12 | { 13 | TexCoords = aTexCoords; 14 | gl_Position = projection * view * model * vec4(aPos, 1.0); 15 | } 16 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/3.1blending_discard/BlendingDiscard.h: -------------------------------------------------------------------------------- 1 | #ifndef BLENDINGDISCARD_H 2 | #define BLENDINGDISCARD_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include "../../utils/CameraUtil.h" 14 | 15 | class BlendingDiscard : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core 16 | { 17 | Q_OBJECT 18 | public: 19 | Q_INVOKABLE BlendingDiscard(QWidget *parent = nullptr); 20 | ~BlendingDiscard(); 21 | protected: 22 | virtual void initializeGL() override; 23 | virtual void resizeGL(int w, int h) override; 24 | virtual void paintGL() override; 25 | virtual bool event(QEvent *e) override; 26 | 27 | private: 28 | QOpenGLVertexArrayObject m_cubeVAO, m_planeVAO, m_transparentVAO; 29 | QOpenGLBuffer m_cubeVBO, m_planeVBO, m_transparentVBO; 30 | 31 | QOpenGLShaderProgram m_program; 32 | 33 | std::unique_ptr m_texture[3]; 34 | 35 | QMatrix4x4 m_model; 36 | QMatrix4x4 m_view; 37 | QMatrix4x4 m_projection; 38 | 39 | std::vector m_vegetation; 40 | 41 | CameraUtil m_camera; 42 | }; 43 | 44 | #endif // BLENDINGDISCARD_H 45 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/3.1blending_discard/blending_discard.frag: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | out vec4 FragColor; 3 | 4 | in vec2 TexCoords; 5 | 6 | uniform sampler2D texture1; 7 | 8 | void main() 9 | { 10 | vec4 texColor = texture2D(texture1, TexCoords); 11 | if (texColor.a < 0.1) { 12 | discard; 13 | } 14 | FragColor = texColor; 15 | } 16 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/3.1blending_discard/blending_discard.vert: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | layout (location = 0) in vec3 aPos; 3 | layout (location = 1) in vec2 aTexCoords; 4 | 5 | out vec2 TexCoords; 6 | 7 | uniform mat4 model; 8 | uniform mat4 view; 9 | uniform mat4 projection; 10 | 11 | void main() 12 | { 13 | TexCoords = aTexCoords; 14 | gl_Position = projection * view * model * vec4(aPos, 1.0); 15 | } 16 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/3.2blending_sort/BlendingSort.h: -------------------------------------------------------------------------------- 1 | #ifndef BLENDINGSORT_H 2 | #define BLENDINGSORT_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include "../../utils/CameraUtil.h" 14 | 15 | class BlendingSort : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core 16 | { 17 | Q_OBJECT 18 | public: 19 | Q_INVOKABLE BlendingSort(QWidget *parent = nullptr); 20 | ~BlendingSort(); 21 | protected: 22 | virtual void initializeGL() override; 23 | virtual void resizeGL(int w, int h) override; 24 | virtual void paintGL() override; 25 | virtual bool event(QEvent *e) override; 26 | 27 | private: 28 | QOpenGLVertexArrayObject m_cubeVAO, m_planeVAO, m_transparentVAO; 29 | QOpenGLBuffer m_cubeVBO, m_planeVBO, m_transparentVBO; 30 | 31 | QOpenGLShaderProgram m_program; 32 | 33 | std::unique_ptr m_texture[3]; 34 | 35 | QMatrix4x4 m_model; 36 | QMatrix4x4 m_view; 37 | QMatrix4x4 m_projection; 38 | 39 | std::vector m_windowPos; 40 | 41 | CameraUtil m_camera; 42 | }; 43 | 44 | #endif // BLENDINGSORT_H 45 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/3.2blending_sort/blending_sort.frag: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | out vec4 FragColor; 3 | 4 | in vec2 TexCoords; 5 | 6 | uniform sampler2D texture1; 7 | 8 | void main() 9 | { 10 | FragColor = texture2D(texture1, TexCoords); 11 | } 12 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/3.2blending_sort/blending_sort.vert: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | layout (location = 0) in vec3 aPos; 3 | layout (location = 1) in vec2 aTexCoords; 4 | 5 | out vec2 TexCoords; 6 | 7 | uniform mat4 model; 8 | uniform mat4 view; 9 | uniform mat4 projection; 10 | 11 | void main() 12 | { 13 | TexCoords = aTexCoords; 14 | gl_Position = projection * view * model * vec4(aPos, 1.0); 15 | } 16 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/4.face_culling_exercise1/FaceCullingExercise1.h: -------------------------------------------------------------------------------- 1 | #ifndef FACECULLINGEXERCISE1_H 2 | #define FACECULLINGEXERCISE1_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include "../../utils/CameraUtil.h" 14 | 15 | class FaceCullingExercise1 : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core 16 | { 17 | Q_OBJECT 18 | public: 19 | Q_INVOKABLE FaceCullingExercise1(QWidget *parent = nullptr); 20 | ~FaceCullingExercise1(); 21 | protected: 22 | virtual void initializeGL() override; 23 | virtual void resizeGL(int w, int h) override; 24 | virtual void paintGL() override; 25 | virtual bool event(QEvent *e) override; 26 | 27 | private: 28 | QOpenGLVertexArrayObject m_cubeVAO, m_planeVAO; 29 | QOpenGLBuffer m_cubeVBO, m_planeVBO; 30 | 31 | QOpenGLShaderProgram m_program; 32 | 33 | std::unique_ptr m_texture[2]; 34 | 35 | QMatrix4x4 m_model; 36 | QMatrix4x4 m_view; 37 | QMatrix4x4 m_projection; 38 | 39 | CameraUtil m_camera; 40 | }; 41 | 42 | #endif // FACECULLINGEXERCISE1_H 43 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/5.1framebuffers/Framebuffers.h: -------------------------------------------------------------------------------- 1 | #ifndef FRAMEBUFFERS_H 2 | #define FRAMEBUFFERS_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include "../../utils/CameraUtil.h" 15 | 16 | class Framebuffers : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core 17 | { 18 | Q_OBJECT 19 | public: 20 | Q_INVOKABLE Framebuffers(QWidget *parent = nullptr); 21 | ~Framebuffers(); 22 | protected: 23 | virtual void initializeGL() override; 24 | virtual void resizeGL(int w, int h) override; 25 | virtual void paintGL() override; 26 | virtual bool event(QEvent *e) override; 27 | 28 | private: 29 | void handleLineMode(bool flag); 30 | 31 | private: 32 | QOpenGLVertexArrayObject m_cubeVAO, m_planeVAO, m_quadVAO; 33 | QOpenGLBuffer m_cubeVBO, m_planeVBO, m_quadVBO; 34 | 35 | QOpenGLShaderProgram m_shader; 36 | QOpenGLShaderProgram m_screenShader; 37 | 38 | std::unique_ptr m_texture[2]; 39 | 40 | std::unique_ptr m_FBO; 41 | 42 | QMatrix4x4 m_model; 43 | QMatrix4x4 m_view; 44 | QMatrix4x4 m_projection; 45 | 46 | CameraUtil m_camera; 47 | 48 | bool m_isLineMode; 49 | int m_postProcessingId; 50 | }; 51 | 52 | #endif // FRAMEBUFFERS_H 53 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/5.1framebuffers/framebuffers.frag: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | out vec4 FragColor; 3 | 4 | in vec2 TexCoords; 5 | 6 | uniform sampler2D texture1; 7 | 8 | void main() 9 | { 10 | FragColor = texture(texture1, TexCoords); 11 | } 12 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/5.1framebuffers/framebuffers.vert: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | layout (location = 0) in vec3 aPos; 3 | layout (location = 1) in vec2 aTexCoords; 4 | 5 | out vec2 TexCoords; 6 | 7 | uniform mat4 model; 8 | uniform mat4 view; 9 | uniform mat4 projection; 10 | 11 | void main() 12 | { 13 | TexCoords = aTexCoords; 14 | gl_Position = projection * view * model * vec4(aPos, 1.0); 15 | } 16 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/5.1framebuffers/framebuffers_screen.frag: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | out vec4 FragColor; 3 | 4 | in vec2 TexCoords; 5 | 6 | uniform int uPostProcessingId; 7 | 8 | uniform sampler2D screenTexture; 9 | 10 | // kernel function releated 11 | const float offset = 1.0 / 300.0; 12 | 13 | vec2 offsets[9] = vec2[]( 14 | vec2(-offset, offset), // 左上 15 | vec2( 0.0f, offset), // 正上 16 | vec2( offset, offset), // 右上 17 | vec2(-offset, 0.0f), // 左 18 | vec2( 0.0f, 0.0f), // 中 19 | vec2( offset, 0.0f), // 右 20 | vec2(-offset, -offset), // 左下 21 | vec2( 0.0f, -offset), // 正下 22 | vec2( offset, -offset) // 右下 23 | ); 24 | 25 | vec4 calculateKernel(float kernel[9]) 26 | { 27 | vec3 sampleTex[9]; 28 | for (int i = 0; i < 9; ++i) { 29 | sampleTex[i] = vec3(texture2D(screenTexture, TexCoords.st + offsets[i])); 30 | } 31 | vec3 col = vec3(0.0); 32 | for (int i = 0; i < 9; ++i) { 33 | col += sampleTex[i] * kernel[i]; 34 | } 35 | return vec4(col, 1.0); 36 | } 37 | 38 | vec4 calculateColor(int type) 39 | { 40 | vec4 color; 41 | // normal 42 | if (type == 0) { 43 | color = texture2D(screenTexture, TexCoords); 44 | } 45 | // inversion 46 | else if (type == 1) { 47 | color = vec4(vec3(1.0 - texture2D(screenTexture, TexCoords)), 1.0); 48 | } 49 | // gray scale 50 | else if (type == 2) { 51 | color = texture2D(screenTexture, TexCoords); 52 | float average = 0.2126 * color.r + 0.7152 * color.g + 0.0722 * color.b; 53 | color = vec4(average, average, average, 1.0); 54 | } 55 | // blur 56 | else if (type == 3) { 57 | float kernel[9] = float[]( 58 | 1.0 / 16, 2.0 / 16, 1.0 / 16, 59 | 2.0 / 16, 4.0 / 16, 2.0 / 16, 60 | 1.0 / 16, 2.0 / 16, 1.0 / 16 61 | ); 62 | color = calculateKernel(kernel); 63 | } 64 | // edge detection 65 | else if (type == 4) { 66 | float kernel[9] = float[]( 67 | 1.0, 1.0, 1.0, 68 | 1.0, -8.0, 1.0, 69 | 1.0, 1.0, 1.0 70 | ); 71 | color = calculateKernel(kernel); 72 | } 73 | // sharpen 74 | else if (type == 5) { 75 | float kernel[9] = float[]( 76 | -1, -1, -1, 77 | -1, 9, -1, 78 | -1, -1, -1 79 | ); 80 | color = calculateKernel(kernel); 81 | } 82 | return color; 83 | } 84 | 85 | void main() 86 | { 87 | FragColor = calculateColor(uPostProcessingId); 88 | } 89 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/5.1framebuffers/framebuffers_screen.vert: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | layout (location = 0) in vec2 aPos; 3 | layout (location = 1) in vec2 aTexCoords; 4 | 5 | out vec2 TexCoords; 6 | 7 | void main() 8 | { 9 | TexCoords = aTexCoords; 10 | gl_Position = vec4(aPos.x, aPos.y, 0.0, 1.0); 11 | } 12 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/5.2framebuffers_exercise1/FramebuffersExercise1.h: -------------------------------------------------------------------------------- 1 | #ifndef FRAMEBUFFERSEXERCISE1_H 2 | #define FRAMEBUFFERSEXERCISE1_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include "../../utils/CameraUtil.h" 15 | 16 | class FramebuffersExercise1 : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core 17 | { 18 | Q_OBJECT 19 | public: 20 | Q_INVOKABLE FramebuffersExercise1(QWidget *parent = nullptr); 21 | ~FramebuffersExercise1(); 22 | protected: 23 | virtual void initializeGL() override; 24 | virtual void resizeGL(int w, int h) override; 25 | virtual void paintGL() override; 26 | virtual bool event(QEvent *e) override; 27 | 28 | private: 29 | void handleLineMode(bool flag); 30 | 31 | private: 32 | QOpenGLVertexArrayObject m_cubeVAO, m_planeVAO, m_quadVAO; 33 | QOpenGLBuffer m_cubeVBO, m_planeVBO, m_quadVBO; 34 | 35 | QOpenGLShaderProgram m_shader; 36 | QOpenGLShaderProgram m_screenShader; 37 | 38 | std::unique_ptr m_texture[2]; 39 | 40 | std::unique_ptr m_FBO; 41 | 42 | QMatrix4x4 m_model; 43 | QMatrix4x4 m_view; 44 | QMatrix4x4 m_projection; 45 | 46 | CameraUtil m_camera; 47 | 48 | bool m_isLineMode; 49 | int m_postProcessingId; 50 | }; 51 | 52 | #endif // FRAMEBUFFERSEXERCISE1_H 53 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/6.1cubemaps_skybox/CubemapsSkybox.h: -------------------------------------------------------------------------------- 1 | #ifndef CUBEMAPSSKYBOX_H 2 | #define CUBEMAPSSKYBOX_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include "../../utils/CameraUtil.h" 14 | #include "../../utils/ShaderUtil.h" 15 | #include "../../utils/CubemapTextureUtil.h" 16 | 17 | class CubemapsSkybox : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core 18 | { 19 | Q_OBJECT 20 | public: 21 | Q_INVOKABLE CubemapsSkybox(QWidget *parent = nullptr); 22 | ~CubemapsSkybox(); 23 | protected: 24 | virtual void initializeGL() override; 25 | virtual void resizeGL(int w, int h) override; 26 | virtual void paintGL() override; 27 | virtual bool event(QEvent *e) override; 28 | 29 | private: 30 | QOpenGLVertexArrayObject m_cubeVAO, m_skyboxVAO; 31 | QOpenGLBuffer m_cubeVBO, m_skyboxVBO; 32 | 33 | std::unique_ptr m_shader; 34 | std::unique_ptr m_skyboxShader; 35 | 36 | std::unique_ptr m_cubemapTexture; 37 | QOpenGLTexture m_cubeTexture; 38 | 39 | QMatrix4x4 m_model; 40 | QMatrix4x4 m_view; 41 | QMatrix4x4 m_projection; 42 | 43 | CameraUtil m_camera; 44 | }; 45 | 46 | #endif // CUBEMAPSSKYBOX_H 47 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/6.1cubemaps_skybox/cubemaps.frag: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | out vec4 FragColor; 3 | 4 | in vec2 TexCoords; 5 | 6 | uniform sampler2D texture1; 7 | 8 | void main() 9 | { 10 | FragColor = texture(texture1, TexCoords); 11 | } 12 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/6.1cubemaps_skybox/cubemaps.vert: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | layout (location = 0) in vec3 aPos; 3 | layout (location = 1) in vec2 aTexCoords; 4 | 5 | out vec2 TexCoords; 6 | 7 | uniform mat4 model; 8 | uniform mat4 view; 9 | uniform mat4 projection; 10 | 11 | void main() 12 | { 13 | TexCoords = aTexCoords; 14 | gl_Position = projection * view * model * vec4(aPos, 1.0); 15 | } 16 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/6.1cubemaps_skybox/skybox.frag: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | out vec4 FragColor; 3 | 4 | in vec3 TexCoords; 5 | 6 | uniform samplerCube skybox; 7 | 8 | void main() 9 | { 10 | 11 | FragColor = textureCube(skybox, TexCoords); 12 | } 13 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/6.1cubemaps_skybox/skybox.vert: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | layout (location = 0) in vec3 aPos; 3 | 4 | out vec3 TexCoords; 5 | 6 | uniform mat4 projection; 7 | uniform mat4 view; 8 | 9 | void main() 10 | { 11 | TexCoords = aPos; 12 | vec4 pos = projection * view * vec4(aPos, 1.0); 13 | gl_Position = pos.xyww;// z/w 是深度值,这里都为1 14 | } 15 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/6.2cubemaps_environment_mapping/CubemapsEnvironmentMapping.h: -------------------------------------------------------------------------------- 1 | #ifndef CUBEMAPSENVIRONMENTMAPPING_H 2 | #define CUBEMAPSENVIRONMENTMAPPING_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include "../../utils/ModelUtil.h" 14 | #include "../../utils/CameraUtil.h" 15 | #include "../../utils/ShaderUtil.h" 16 | #include "../../utils/CubemapTextureUtil.h" 17 | 18 | class CubemapsEnvironmentMapping : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core 19 | { 20 | Q_OBJECT 21 | public: 22 | Q_INVOKABLE CubemapsEnvironmentMapping(QWidget *parent = nullptr); 23 | ~CubemapsEnvironmentMapping(); 24 | protected: 25 | virtual void initializeGL() override; 26 | virtual void resizeGL(int w, int h) override; 27 | virtual void paintGL() override; 28 | virtual bool event(QEvent *e) override; 29 | 30 | private: 31 | QOpenGLVertexArrayObject m_cubeVAO, m_skyboxVAO; 32 | QOpenGLBuffer m_cubeVBO, m_skyboxVBO; 33 | 34 | std::unique_ptr m_assimpModel; 35 | 36 | std::unique_ptr m_shader; 37 | std::unique_ptr m_skyboxShader; 38 | 39 | std::unique_ptr m_cubemapTexture; 40 | 41 | QMatrix4x4 m_model; 42 | QMatrix4x4 m_view; 43 | QMatrix4x4 m_projection; 44 | 45 | CameraUtil m_camera; 46 | 47 | bool m_isRefract; 48 | }; 49 | 50 | #endif // CUBEMAPSENVIRONMENTMAPPING_H 51 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/6.2cubemaps_environment_mapping/cubemaps.frag: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | out vec4 FragColor; 3 | 4 | in vec3 Normal; 5 | in vec3 Position; 6 | 7 | uniform bool isRefract; 8 | uniform vec3 cameraPos; 9 | uniform samplerCube skybox; 10 | 11 | void main() 12 | { 13 | // 观察方向 14 | vec3 I = normalize(Position - cameraPos); 15 | // 反射 or 折射 16 | vec3 R; 17 | if (isRefract) { 18 | R = refract(I, normalize(Normal), 1.00 / 1.52); 19 | } else { 20 | R = reflect(I, normalize(Normal)); 21 | } 22 | 23 | FragColor = vec4(texture(skybox, R).rgb, 1.0); 24 | } 25 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/6.2cubemaps_environment_mapping/cubemaps.vert: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | layout (location = 0) in vec3 aPos; 3 | layout (location = 1) in vec3 aNormal; 4 | 5 | out vec3 Normal; 6 | out vec3 Position; 7 | 8 | uniform mat4 model; 9 | uniform mat4 view; 10 | uniform mat4 projection; 11 | 12 | void main() 13 | { 14 | Normal = mat3(transpose(inverse(model))) * aNormal; 15 | Position = vec3(model * vec4(aPos, 1.0)); 16 | gl_Position = projection * view * model * vec4(aPos, 1.0); 17 | } 18 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/8.advanced_glsl_ubo/AdvancedGlslUbo.h: -------------------------------------------------------------------------------- 1 | #ifndef ADVANCEDGLSLUBO_H 2 | #define ADVANCEDGLSLUBO_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include "../../utils/CameraUtil.h" 15 | #include "../../utils/ShaderUtil.h" 16 | #include "../../utils/OpenGLUniformbufferObject.h" 17 | 18 | class AdvancedGlslUbo : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core 19 | { 20 | Q_OBJECT 21 | public: 22 | Q_INVOKABLE AdvancedGlslUbo(QWidget *parent = nullptr); 23 | ~AdvancedGlslUbo(); 24 | protected: 25 | virtual void initializeGL() override; 26 | virtual void resizeGL(int w, int h) override; 27 | virtual void paintGL() override; 28 | virtual bool event(QEvent *e) override; 29 | 30 | private: 31 | void handleLoggedMessage(const QOpenGLDebugMessage &debugMessage); 32 | 33 | private: 34 | QOpenGLVertexArrayObject m_cubeVAO; 35 | QOpenGLBuffer m_cubeVBO; 36 | 37 | std::unique_ptr m_UBO; 38 | 39 | std::unique_ptr m_shaderRed; 40 | std::unique_ptr m_shaderGreen; 41 | std::unique_ptr m_shaderBlue; 42 | std::unique_ptr m_shaderYellow; 43 | 44 | QMatrix4x4 m_model; 45 | QMatrix4x4 m_view; 46 | QMatrix4x4 m_projection; 47 | 48 | CameraUtil m_camera; 49 | }; 50 | 51 | #endif // ADVANCEDGLSLUBO_H 52 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/8.advanced_glsl_ubo/advanced_glsl.vert: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | layout (location = 0) in vec3 aPos; 3 | 4 | layout (std140) uniform Matrices 5 | { 6 | mat4 projection; 7 | mat4 view; 8 | }; 9 | uniform mat4 model; 10 | 11 | void main() 12 | { 13 | gl_Position = projection * view * model * vec4(aPos, 1.0); 14 | } 15 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/8.advanced_glsl_ubo/blue.frag: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | out vec4 FragColor; 3 | 4 | void main() 5 | { 6 | FragColor = vec4(0.0, 0.0, 1.0, 1.0); 7 | } -------------------------------------------------------------------------------- /src/4.advanced_opengl/8.advanced_glsl_ubo/green.frag: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | out vec4 FragColor; 3 | 4 | void main() 5 | { 6 | FragColor = vec4(0.0, 1.0, 0.0, 1.0); 7 | } -------------------------------------------------------------------------------- /src/4.advanced_opengl/8.advanced_glsl_ubo/red.frag: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | out vec4 FragColor; 3 | 4 | void main() 5 | { 6 | FragColor = vec4(1.0, 0.0, 0.0, 1.0); 7 | } -------------------------------------------------------------------------------- /src/4.advanced_opengl/8.advanced_glsl_ubo/yellow.frag: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | out vec4 FragColor; 3 | 4 | void main() 5 | { 6 | FragColor = vec4(1.0, 1.0, 0.0, 1.0); 7 | } -------------------------------------------------------------------------------- /src/4.advanced_opengl/9.1geometry_shader_houses/GeometryShaderHouses.cpp: -------------------------------------------------------------------------------- 1 | #include "GeometryShaderHouses.h" 2 | 3 | #include 4 | 5 | GeometryShaderHouses::GeometryShaderHouses(QWidget *parent) 6 | : QOpenGLWidget(parent), 7 | m_VBO(QOpenGLBuffer::VertexBuffer), 8 | m_camera(this) 9 | { 10 | } 11 | 12 | GeometryShaderHouses::~GeometryShaderHouses() 13 | { 14 | makeCurrent(); 15 | 16 | doneCurrent(); 17 | } 18 | 19 | void GeometryShaderHouses::initializeGL() 20 | { 21 | if(!context()){ 22 | qCritical() << "Cant't get OpenGL contex"; 23 | close(); 24 | return; 25 | } 26 | initializeOpenGLFunctions(); 27 | 28 | QOpenGLDebugLogger *logger = new QOpenGLDebugLogger(this); 29 | logger->initialize(); // initializes in the current context, i.e. ctx 30 | connect(logger, &QOpenGLDebugLogger::messageLogged, this, &GeometryShaderHouses::handleLoggedMessage); 31 | logger->startLogging(); 32 | 33 | 34 | glEnable(GL_DEPTH_TEST); 35 | glDepthFunc(GL_LESS); 36 | 37 | //shader初始化 38 | { 39 | m_shader = std::make_unique(":/4.advanced_opengl/9.1geometry_shader_houses/geometry_shader_houses.vert", 40 | ":/4.advanced_opengl/9.1geometry_shader_houses/geometry_shader_houses.frag", 41 | ":/4.advanced_opengl/9.1geometry_shader_houses/geometry_shader_houses.geom"); 42 | } 43 | // 44 | { 45 | // set up vertex data (and buffer(s)) and configure vertex attributes 46 | GLfloat points[] = { 47 | -0.5f, 0.5f, 1.0f, 0.0f, 0.0f, // top-left 48 | 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, // top-right 49 | 0.5f, -0.5f, 0.0f, 0.0f, 1.0f, // bottom-right 50 | -0.5f, -0.5f, 1.0f, 1.0f, 0.0f // bottom-left 51 | }; 52 | 53 | m_VAO.create(); 54 | m_VAO.bind(); 55 | m_VBO.create(); 56 | m_VBO.bind(); 57 | m_VBO.allocate(points, sizeof(points)); 58 | glEnableVertexAttribArray(0); 59 | glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), 0); 60 | glEnableVertexAttribArray(1); 61 | glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(2 * sizeof(float))); 62 | m_VAO.release(); 63 | } 64 | // 相机类初始化 65 | m_camera.init(); 66 | } 67 | 68 | void GeometryShaderHouses::resizeGL(int w, int h) 69 | { 70 | glViewport(0, 0, w, h); 71 | } 72 | 73 | void GeometryShaderHouses::paintGL() 74 | { 75 | glClearColor(0.1f, 0.1f, 0.1f, 1.0f); 76 | glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 77 | 78 | // draw points 79 | m_shader->bind(); 80 | m_VAO.bind(); 81 | glDrawArrays(GL_POINTS, 0, 4); 82 | m_VAO.release(); 83 | m_shader->release(); 84 | } 85 | 86 | bool GeometryShaderHouses::event(QEvent *e) 87 | { 88 | m_camera.handle(e); 89 | return QWidget::event(e); 90 | } 91 | 92 | void GeometryShaderHouses::handleLoggedMessage(const QOpenGLDebugMessage &debugMessage) 93 | { 94 | qDebug() << debugMessage.message(); 95 | } 96 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/9.1geometry_shader_houses/GeometryShaderHouses.h: -------------------------------------------------------------------------------- 1 | #ifndef GEOMETRYSHADERHOUSES_H 2 | #define GEOMETRYSHADERHOUSES_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include "../../utils/CameraUtil.h" 15 | #include "../../utils/ShaderUtil.h" 16 | #include "../../utils/OpenGLUniformbufferObject.h" 17 | 18 | class GeometryShaderHouses : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core 19 | { 20 | Q_OBJECT 21 | public: 22 | Q_INVOKABLE GeometryShaderHouses(QWidget *parent = nullptr); 23 | ~GeometryShaderHouses(); 24 | protected: 25 | virtual void initializeGL() override; 26 | virtual void resizeGL(int w, int h) override; 27 | virtual void paintGL() override; 28 | virtual bool event(QEvent *e) override; 29 | 30 | private: 31 | void handleLoggedMessage(const QOpenGLDebugMessage &debugMessage); 32 | 33 | private: 34 | QOpenGLVertexArrayObject m_VAO; 35 | QOpenGLBuffer m_VBO; 36 | 37 | std::unique_ptr m_shader; 38 | 39 | QMatrix4x4 m_model; 40 | QMatrix4x4 m_view; 41 | QMatrix4x4 m_projection; 42 | 43 | CameraUtil m_camera; 44 | }; 45 | 46 | #endif // GEOMETRYSHADERHOUSES_H 47 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/9.1geometry_shader_houses/geometry_shader_houses.frag: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | out vec4 FragColor; 3 | 4 | in vec3 fColor; 5 | 6 | void main() 7 | { 8 | FragColor = vec4(fColor, 1.0); 9 | } 10 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/9.1geometry_shader_houses/geometry_shader_houses.geom: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | layout (points) in; 3 | layout (triangle_strip, max_vertices = 5) out; 4 | 5 | in VS_OUT { 6 | vec3 color; 7 | } gs_in[]; 8 | 9 | out vec3 fColor; 10 | 11 | void build_house(vec4 position) 12 | { 13 | fColor = gs_in[0].color; // gs_in[0] since there's only one input vertex 14 | gl_Position = position + vec4(-0.2, -0.2, 0.0, 0.0); // 1:bottom-left 15 | EmitVertex(); 16 | gl_Position = position + vec4( 0.2, -0.2, 0.0, 0.0); // 2:bottom-right 17 | EmitVertex(); 18 | gl_Position = position + vec4(-0.2, 0.2, 0.0, 0.0); // 3:top-left 19 | EmitVertex(); 20 | gl_Position = position + vec4( 0.2, 0.2, 0.0, 0.0); // 4:top-right 21 | EmitVertex(); 22 | gl_Position = position + vec4( 0.0, 0.4, 0.0, 0.0); // 5:top 23 | fColor = vec3(1.0, 1.0, 1.0); //屋顶颜色 24 | EmitVertex(); 25 | EndPrimitive(); 26 | } 27 | 28 | void main() { 29 | build_house(gl_in[0].gl_Position); 30 | } 31 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/9.1geometry_shader_houses/geometry_shader_houses.vert: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | layout (location = 0) in vec2 aPos; 3 | layout (location = 1) in vec3 aColor; 4 | 5 | out VS_OUT { 6 | vec3 color; 7 | } vs_out; 8 | 9 | void main() 10 | { 11 | vs_out.color = aColor; 12 | gl_Position = vec4(aPos.x, aPos.y, 0.0, 1.0); 13 | } 14 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/9.2geometry_shader_exploding/GeometryShaderExploding.cpp: -------------------------------------------------------------------------------- 1 | #include "GeometryShaderExploding.h" 2 | 3 | #include 4 | 5 | GeometryShaderExploding::GeometryShaderExploding(QWidget *parent) 6 | : QOpenGLWidget(parent), 7 | m_camera(this) 8 | { 9 | QTimer* timer = new QTimer(this); 10 | connect(timer, &QTimer::timeout, this, [&](){update();}); 11 | timer->start(100); 12 | } 13 | 14 | GeometryShaderExploding::~GeometryShaderExploding() 15 | { 16 | makeCurrent(); 17 | m_model->destory(); 18 | doneCurrent(); 19 | } 20 | 21 | void GeometryShaderExploding::initializeGL() 22 | { 23 | if(!context()){ 24 | qCritical() << "Cant't get OpenGL contex"; 25 | close(); 26 | return; 27 | } 28 | initializeOpenGLFunctions(); 29 | 30 | QOpenGLDebugLogger *logger = new QOpenGLDebugLogger(this); 31 | logger->initialize(); // initializes in the current context, i.e. ctx 32 | connect(logger, &QOpenGLDebugLogger::messageLogged, this, &GeometryShaderExploding::handleLoggedMessage); 33 | logger->startLogging(); 34 | 35 | 36 | glEnable(GL_DEPTH_TEST); 37 | glDepthFunc(GL_LESS); 38 | 39 | //shader初始化 40 | { 41 | m_shader = std::make_unique(":/4.advanced_opengl/9.2geometry_shader_exploding/geometry_shader_exploding.vert", 42 | ":/4.advanced_opengl/9.2geometry_shader_exploding/geometry_shader_exploding.frag", 43 | ":/4.advanced_opengl/9.2geometry_shader_exploding/geometry_shader_exploding.geom"); 44 | } 45 | // load model 46 | m_model = std::make_unique(QString("%1%2").arg(STR_SRC_PATH).arg("/resources/objects/nanosuit/nanosuit.obj"), context()); 47 | // 相机类初始化 48 | m_camera.init(); 49 | } 50 | 51 | void GeometryShaderExploding::resizeGL(int w, int h) 52 | { 53 | glViewport(0, 0, w, h); 54 | } 55 | 56 | void GeometryShaderExploding::paintGL() 57 | { 58 | glClearColor(1.0f, 1.0f, 1.0f, 1.0f); 59 | glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 60 | 61 | m_shader->bind(); 62 | // mvp 63 | auto projection = QMatrix4x4(); 64 | projection.perspective(45.0, 1.0 * width() / height(), 0.1, 100.0); 65 | auto view = m_camera.getViewMatrix(); 66 | auto model = QMatrix4x4(); 67 | model.scale(0.1); 68 | m_shader->setUniformValue("projection", projection); 69 | m_shader->setUniformValue("view", view); 70 | m_shader->setUniformValue("model", model); 71 | // time 72 | m_shader->setUniformValue("time", GLfloat(QTime::currentTime().msecsSinceStartOfDay() / 1000.0)); 73 | // draw 74 | m_model->Draw(m_shader.get()); 75 | m_shader->release(); 76 | } 77 | 78 | bool GeometryShaderExploding::event(QEvent *e) 79 | { 80 | m_camera.handle(e); 81 | return QWidget::event(e); 82 | } 83 | 84 | void GeometryShaderExploding::handleLoggedMessage(const QOpenGLDebugMessage &debugMessage) 85 | { 86 | qDebug() << debugMessage.message(); 87 | } 88 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/9.2geometry_shader_exploding/GeometryShaderExploding.h: -------------------------------------------------------------------------------- 1 | #ifndef GEOMETRYSHADEREXPLODING_H 2 | #define GEOMETRYSHADEREXPLODING_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include "Config.h" 15 | #include "../../utils/ModelUtil.h" 16 | #include "../../utils/CameraUtil.h" 17 | #include "../../utils/ShaderUtil.h" 18 | #include "../../utils/OpenGLUniformbufferObject.h" 19 | 20 | class GeometryShaderExploding : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core 21 | { 22 | Q_OBJECT 23 | public: 24 | Q_INVOKABLE GeometryShaderExploding(QWidget *parent = nullptr); 25 | ~GeometryShaderExploding(); 26 | protected: 27 | virtual void initializeGL() override; 28 | virtual void resizeGL(int w, int h) override; 29 | virtual void paintGL() override; 30 | virtual bool event(QEvent *e) override; 31 | 32 | private: 33 | void handleLoggedMessage(const QOpenGLDebugMessage &debugMessage); 34 | 35 | private: 36 | std::unique_ptr m_shader; 37 | std::unique_ptr m_model; 38 | 39 | CameraUtil m_camera; 40 | }; 41 | 42 | #endif // GEOMETRYSHADEREXPLODING_H 43 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/9.2geometry_shader_exploding/geometry_shader_exploding.frag: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | out vec4 FragColor; 3 | 4 | in vec2 TexCoords; 5 | 6 | uniform sampler2D texture_diffuse1; 7 | 8 | void main() 9 | { 10 | FragColor = texture(texture_diffuse1, TexCoords); 11 | } 12 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/9.2geometry_shader_exploding/geometry_shader_exploding.geom: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | layout (triangles) in; 3 | layout (triangle_strip, max_vertices = 3) out; 4 | 5 | in VS_OUT { 6 | vec2 texCoords; 7 | } gs_in[]; 8 | 9 | out vec2 TexCoords; 10 | 11 | uniform float time; 12 | 13 | vec4 explode(vec4 position, vec3 normal) 14 | { 15 | float magnitude = 2.0; 16 | vec3 direction = normal * ((sin(time) + 1.0) / 2.0) * magnitude; 17 | return position + vec4(direction, 0.0); 18 | } 19 | 20 | vec3 GetNormal() 21 | { 22 | vec3 a = vec3(gl_in[0].gl_Position) - vec3(gl_in[1].gl_Position); 23 | vec3 b = vec3(gl_in[2].gl_Position) - vec3(gl_in[1].gl_Position); 24 | return normalize(cross(a, b)); 25 | } 26 | 27 | void main() { 28 | vec3 normal = GetNormal(); 29 | 30 | gl_Position = explode(gl_in[0].gl_Position, normal); 31 | TexCoords = gs_in[0].texCoords; 32 | EmitVertex(); 33 | gl_Position = explode(gl_in[1].gl_Position, normal); 34 | TexCoords = gs_in[1].texCoords; 35 | EmitVertex(); 36 | gl_Position = explode(gl_in[2].gl_Position, normal); 37 | TexCoords = gs_in[2].texCoords; 38 | EmitVertex(); 39 | EndPrimitive(); 40 | } 41 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/9.2geometry_shader_exploding/geometry_shader_exploding.vert: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | layout (location = 0) in vec3 aPos; 3 | layout (location = 2) in vec2 aTexCoords; 4 | 5 | out VS_OUT { 6 | vec2 texCoords; 7 | } vs_out; 8 | 9 | uniform mat4 projection; 10 | uniform mat4 view; 11 | uniform mat4 model; 12 | 13 | void main() 14 | { 15 | vs_out.texCoords = aTexCoords; 16 | gl_Position = projection * view * model * vec4(aPos, 1.0); 17 | } 18 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/9.3geometry_shader_normals/GeometryShaderNormals.cpp: -------------------------------------------------------------------------------- 1 | #include "GeometryShaderNormals.h" 2 | 3 | #include 4 | 5 | GeometryShaderNormals::GeometryShaderNormals(QWidget *parent) 6 | : QOpenGLWidget(parent), 7 | m_camera(this) 8 | { 9 | } 10 | 11 | GeometryShaderNormals::~GeometryShaderNormals() 12 | { 13 | makeCurrent(); 14 | m_model->destory(); 15 | doneCurrent(); 16 | } 17 | 18 | void GeometryShaderNormals::initializeGL() 19 | { 20 | if(!context()){ 21 | qCritical() << "Cant't get OpenGL contex"; 22 | close(); 23 | return; 24 | } 25 | initializeOpenGLFunctions(); 26 | 27 | QOpenGLDebugLogger *logger = new QOpenGLDebugLogger(this); 28 | logger->initialize(); // initializes in the current context, i.e. ctx 29 | connect(logger, &QOpenGLDebugLogger::messageLogged, this, &GeometryShaderNormals::handleLoggedMessage); 30 | logger->startLogging(); 31 | 32 | 33 | glEnable(GL_DEPTH_TEST); 34 | glDepthFunc(GL_LESS); 35 | 36 | //shader初始化 37 | { 38 | m_normalShader = std::make_unique(":/4.advanced_opengl/9.3geometry_shader_normals/normal_visualization.vert", 39 | ":/4.advanced_opengl/9.3geometry_shader_normals/normal_visualization.frag", 40 | ":/4.advanced_opengl/9.3geometry_shader_normals/normal_visualization.geom"); 41 | m_shader = std::make_unique(":/4.advanced_opengl/9.3geometry_shader_normals/default.vert", 42 | ":/4.advanced_opengl/9.3geometry_shader_normals/default.frag"); 43 | } 44 | // load model 45 | m_model = std::make_unique(QString("%1%2").arg(STR_SRC_PATH).arg("/resources/objects/nanosuit/nanosuit.obj"), context()); 46 | // 相机类初始化 47 | m_camera.init(); 48 | } 49 | 50 | void GeometryShaderNormals::resizeGL(int w, int h) 51 | { 52 | glViewport(0, 0, w, h); 53 | } 54 | 55 | void GeometryShaderNormals::paintGL() 56 | { 57 | glClearColor(0.1f, 0.1f, 0.1f, 1.0f); 58 | glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 59 | 60 | m_shader->bind(); 61 | // mvp 62 | auto projection = QMatrix4x4(); 63 | projection.perspective(45.0, 1.0 * width() / height(), 0.1, 100.0); 64 | auto view = m_camera.getViewMatrix(); 65 | auto model = QMatrix4x4(); 66 | //model.scale(0.1); 67 | m_shader->setUniformValue("projection", projection); 68 | m_shader->setUniformValue("view", view); 69 | m_shader->setUniformValue("model", model); 70 | // draw model as usual 71 | m_model->Draw(m_shader.get()); 72 | 73 | // then draw model with normal visualizing geometry shader 74 | m_normalShader->bind(); 75 | m_normalShader->setUniformValue("projection", projection); 76 | m_normalShader->setUniformValue("view", view); 77 | m_normalShader->setUniformValue("model", model); 78 | m_model->Draw(m_normalShader.get()); 79 | m_normalShader->release(); 80 | } 81 | 82 | bool GeometryShaderNormals::event(QEvent *e) 83 | { 84 | m_camera.handle(e); 85 | return QWidget::event(e); 86 | } 87 | 88 | void GeometryShaderNormals::handleLoggedMessage(const QOpenGLDebugMessage &debugMessage) 89 | { 90 | qDebug() << debugMessage.message(); 91 | } 92 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/9.3geometry_shader_normals/GeometryShaderNormals.h: -------------------------------------------------------------------------------- 1 | #ifndef GEOMETRYSHADERNORMALS_H 2 | #define GEOMETRYSHADERNORMALS_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include "Config.h" 15 | #include "../../utils/ModelUtil.h" 16 | #include "../../utils/CameraUtil.h" 17 | #include "../../utils/ShaderUtil.h" 18 | #include "../../utils/OpenGLUniformbufferObject.h" 19 | 20 | class GeometryShaderNormals : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core 21 | { 22 | Q_OBJECT 23 | public: 24 | Q_INVOKABLE GeometryShaderNormals(QWidget *parent = nullptr); 25 | ~GeometryShaderNormals(); 26 | protected: 27 | virtual void initializeGL() override; 28 | virtual void resizeGL(int w, int h) override; 29 | virtual void paintGL() override; 30 | virtual bool event(QEvent *e) override; 31 | 32 | private: 33 | void handleLoggedMessage(const QOpenGLDebugMessage &debugMessage); 34 | 35 | private: 36 | std::unique_ptr m_shader; 37 | std::unique_ptr m_normalShader; 38 | std::unique_ptr m_model; 39 | 40 | CameraUtil m_camera; 41 | }; 42 | 43 | #endif // GEOMETRYSHADERNORMALS_H 44 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/9.3geometry_shader_normals/default.frag: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | out vec4 FragColor; 3 | 4 | in vec2 TexCoords; 5 | 6 | uniform sampler2D texture_diffuse1; 7 | 8 | void main() 9 | { 10 | FragColor = texture(texture_diffuse1, TexCoords); 11 | } 12 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/9.3geometry_shader_normals/default.vert: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | layout (location = 0) in vec3 aPos; 3 | layout (location = 2) in vec2 aTexCoords; 4 | 5 | out vec2 TexCoords; 6 | 7 | uniform mat4 projection; 8 | uniform mat4 view; 9 | uniform mat4 model; 10 | 11 | void main() 12 | { 13 | TexCoords = aTexCoords; 14 | gl_Position = projection * view * model * vec4(aPos, 1.0); 15 | } 16 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/9.3geometry_shader_normals/normal_visualization.frag: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | out vec4 FragColor; 3 | 4 | void main() 5 | { 6 | FragColor = vec4(1.0, 1.0, 0.0, 1.0); 7 | } -------------------------------------------------------------------------------- /src/4.advanced_opengl/9.3geometry_shader_normals/normal_visualization.geom: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | layout (triangles) in; 3 | layout (line_strip, max_vertices = 6) out; 4 | 5 | in VS_OUT { 6 | vec3 normal; 7 | } gs_in[]; 8 | 9 | const float MAGNITUDE = 0.2; 10 | 11 | uniform mat4 projection; 12 | 13 | void GenerateLine(int index) 14 | { 15 | gl_Position = projection * gl_in[index].gl_Position; 16 | EmitVertex(); 17 | gl_Position = projection * (gl_in[index].gl_Position + vec4(gs_in[index].normal, 0.0) * MAGNITUDE); 18 | EmitVertex(); 19 | EndPrimitive(); 20 | } 21 | 22 | void main() 23 | { 24 | GenerateLine(0); // first vertex normal 25 | GenerateLine(1); // second vertex normal 26 | GenerateLine(2); // third vertex normal 27 | } 28 | -------------------------------------------------------------------------------- /src/4.advanced_opengl/9.3geometry_shader_normals/normal_visualization.vert: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | layout (location = 0) in vec3 aPos; 3 | layout (location = 1) in vec3 aNormal; 4 | 5 | out VS_OUT { 6 | vec3 normal; 7 | } vs_out; 8 | 9 | uniform mat4 view; 10 | uniform mat4 model; 11 | 12 | void main() 13 | { 14 | mat3 normalMatrix = mat3(transpose(inverse(view * model))); 15 | vs_out.normal = vec3(vec4(normalMatrix * aNormal, 0.0)); 16 | gl_Position = view * model * vec4(aPos, 1.0); 17 | } 18 | -------------------------------------------------------------------------------- /src/5.advanced_lighting/1.advanced_lighting/AdvancedLighting.h: -------------------------------------------------------------------------------- 1 | #ifndef ADVANCEDLIGHTING_H 2 | #define ADVANCEDLIGHTING_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include "../../utils/CameraUtil.h" 16 | #include "../../utils/ModelUtil.h" 17 | #include "../../utils/ShaderUtil.h" 18 | 19 | class AdvancedLighting : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core 20 | { 21 | Q_OBJECT 22 | public: 23 | Q_INVOKABLE AdvancedLighting(QWidget *parent = nullptr); 24 | ~AdvancedLighting(); 25 | protected: 26 | virtual void initializeGL() override; 27 | virtual void resizeGL(int w, int h) override; 28 | virtual void paintGL() override; 29 | 30 | virtual bool event(QEvent *e) override; 31 | 32 | private: 33 | QOpenGLVertexArrayObject m_planeVAO; 34 | QOpenGLBuffer m_planeVBO; 35 | 36 | std::unique_ptr m_shader; 37 | 38 | std::unique_ptr m_texture; 39 | 40 | CameraUtil m_camera; 41 | 42 | QSlider* m_sliderAmbientStrength; 43 | QSlider* m_sliderSpecularStrength; 44 | QSlider* m_sliderSpecularShininess; 45 | 46 | QCheckBox* m_checkBoxBlinn; 47 | }; 48 | 49 | #endif // ADVANCEDLIGHTING_H 50 | -------------------------------------------------------------------------------- /src/5.advanced_lighting/1.advanced_lighting/advanced_lighting.frag: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | out vec4 FragColor; 3 | 4 | in VS_OUT 5 | { 6 | vec3 FragPos; 7 | vec3 Normal; 8 | vec2 TexCoords; 9 | } fs_in; 10 | 11 | uniform float ambientStrength; 12 | uniform float specularStrength; 13 | uniform float specularShininess; 14 | 15 | uniform sampler2D floorTexture; 16 | uniform vec3 lightPos; 17 | uniform vec3 viewPos; 18 | uniform bool blinn; 19 | 20 | void main() 21 | { 22 | vec3 color = texture2D(floorTexture, fs_in.TexCoords).rgb; 23 | //环境光 24 | vec3 ambient = ambientStrength * color; 25 | //漫反射光 26 | vec3 norm = normalize(fs_in.Normal); 27 | vec3 lightDir = normalize(lightPos - fs_in.FragPos); 28 | float diff = max(dot(norm, lightDir), 0.0); 29 | vec3 diffuse = diff * color; 30 | //镜面光 31 | vec3 viewDir = normalize(viewPos - fs_in.FragPos); 32 | 33 | float spec = 0.0; 34 | if (blinn) { 35 | vec3 halfwayDir = normalize(lightDir + viewDir); 36 | spec = pow(max(dot(norm, halfwayDir), 0.0), specularShininess); 37 | } else { 38 | vec3 reflectDir = reflect(-lightDir, norm); 39 | spec = pow(max(dot(viewDir, reflectDir), 0.0), specularShininess); 40 | } 41 | vec3 specular = specularStrength * spec * vec3(0.3); // assuming bright white light color 42 | 43 | FragColor = vec4(ambient + diffuse + specular, 1.0); 44 | } 45 | -------------------------------------------------------------------------------- /src/5.advanced_lighting/1.advanced_lighting/advanced_lighting.vert: -------------------------------------------------------------------------------- 1 | #version 330 core 2 | layout (location = 0) in vec3 aPos; 3 | layout (location = 1) in vec3 aNormal; 4 | layout (location = 2) in vec2 aTexCoords; 5 | 6 | out VS_OUT 7 | { 8 | vec3 FragPos; 9 | vec3 Normal; 10 | vec2 TexCoords; 11 | } vs_out; 12 | 13 | uniform mat4 view; 14 | uniform mat4 projection; 15 | 16 | void main() 17 | { 18 | vs_out.FragPos = aPos; 19 | vs_out.Normal = aNormal; 20 | vs_out.TexCoords = aTexCoords; 21 | gl_Position = projection * view * vec4(aPos, 1.0); 22 | } 23 | -------------------------------------------------------------------------------- /src/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | file(GLOB_RECURSE source CONFIGURE_DEPENDS *.h *.cpp *.qrc *.ui) 2 | set(source_shaders ${CMAKE_CURRENT_SOURCE_DIR}/shaders.qrc) 3 | set(source_resources ${PROJECT_SOURCE_DIR}/resources/resources.qrc) 4 | 5 | find_package(Qt5 COMPONENTS Gui OpenGL REQUIRED) 6 | find_package(assimp CONFIG REQUIRED) 7 | 8 | add_executable(learnopengl ${source} ${source_shaders} ${source_resources}) 9 | 10 | set_target_properties(learnopengl PROPERTIES 11 | AUTOUIC ON 12 | AUTOMOC ON 13 | AUTORCC ON 14 | WIN32_EXECUTABLE OFF 15 | ) 16 | 17 | target_link_libraries(learnopengl PRIVATE assimp::assimp) 18 | target_link_libraries(learnopengl PRIVATE Qt5::Gui Qt5::OpenGL) 19 | 20 | target_include_directories(learnopengl PRIVATE .) 21 | 22 | target_compile_definitions(learnopengl PRIVATE SRC_PATH=${PROJECT_SOURCE_DIR}) 23 | -------------------------------------------------------------------------------- /src/Config.h: -------------------------------------------------------------------------------- 1 | #ifndef CONFIG_H 2 | #define CONFIG_H 3 | 4 | #define MACRO2STR(R) #R 5 | #define STR_MACRO(R) MACRO2STR(R) 6 | #define STR_SRC_PATH STR_MACRO(SRC_PATH) // get src file path 7 | 8 | #endif // CONFIG_H 9 | -------------------------------------------------------------------------------- /src/MainWindow.h: -------------------------------------------------------------------------------- 1 | #ifndef MAINWINDOW_H 2 | #define MAINWINDOW_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | 12 | #include "1.getting_started/1.1hello_window/HelloWindow.h" 13 | #include "1.getting_started/2.1hello_triangle/HelloTriangle.h" 14 | #include "1.getting_started/2.2hello_triangle_indexed/HelloTriangleIndexed.h" 15 | #include "1.getting_started/2.3hello_triangle_exercise1/HelloTriangleExercise1.h" 16 | #include "1.getting_started/2.4hello_triangle_exercise2/HelloTriangleExercise2.h" 17 | #include "1.getting_started/2.5hello_triangle_exercise3/HelloTriangleExercise3.h" 18 | #include "1.getting_started/3.2shaders_interpolation/ShadersInterpolation.h" 19 | #include "1.getting_started/4.1textures/Textures.h" 20 | #include "1.getting_started/4.4textures_exercise2/TexturesExercise2.h" 21 | #include "1.getting_started/4.5textures_exercise3/TexturesExercise3.h" 22 | #include "1.getting_started/4.6textures_exercise4/TexturesExercise4.h" 23 | #include "1.getting_started/5.1transformations/Transformations.h" 24 | #include "1.getting_started/6.1coordinate_systems/CoordinateSystems.h" 25 | #include "1.getting_started/6.2coordinate_systems_depth/CoordinateSystemsDepth.h" 26 | #include "1.getting_started/6.3coordinate_systems_exercise/CoordinateSystemsExercise.h" 27 | #include "1.getting_started/7.1camera_circle/CameraCircle.h" 28 | #include "1.getting_started/7.2camera_interact/CameraInteract.h" 29 | #include "1.getting_started/7.4camera_class/CameraClass.h" 30 | #include "2.lighting/1.colors/Colors.h" 31 | #include "2.lighting/2.1basic_lighting_diffuse/BasicLightingDiffuse.h" 32 | #include "2.lighting/2.2basic_lighting_specular/BasicLightingSpecular.h" 33 | #include "2.lighting/2.3basic_lighting_exercise1/BasicLightingExercise1.h" 34 | #include "2.lighting/2.5basic_lighting_exercise3/BasicLightingExercise3.h" 35 | #include "2.lighting/3.1materials/Materials.h" 36 | #include "2.lighting/4.1lighting_maps_diffuse_map/LightingMapsDiffuseMap.h" 37 | #include "2.lighting/4.2lighting_maps_specular_map/LightingMapsSpecularMap.h" 38 | #include "2.lighting/4.3lighting_maps_exercise2/LightingMapsExercise2.h" 39 | #include "2.lighting/4.4lighting_maps_exercise4/LightingMapsExercise4.h" 40 | #include "2.lighting/5.1light_casters_directional/LightCastersDirectional.h" 41 | #include "2.lighting/5.2light_casters_point/LightCastersPoint.h" 42 | #include "2.lighting/5.3light_casters_spot/LightCastersSpot.h" 43 | #include "2.lighting/6.1multiple_lights/MultipleLights.h" 44 | #include "3.model_loading/1.model_loading/ModelLoading.h" 45 | #include "4.advanced_opengl/1.1depth_testing/DepthTesting.h" 46 | #include "4.advanced_opengl/2.stencil_testing/StencilTesting.h" 47 | #include "4.advanced_opengl/3.1blending_discard/BlendingDiscard.h" 48 | #include "4.advanced_opengl/3.2blending_sort/BlendingSort.h" 49 | #include "4.advanced_opengl/4.face_culling_exercise1/FaceCullingExercise1.h" 50 | #include "4.advanced_opengl/5.1framebuffers/Framebuffers.h" 51 | #include "4.advanced_opengl/5.2framebuffers_exercise1/FramebuffersExercise1.h" 52 | #include "4.advanced_opengl/6.1cubemaps_skybox/CubemapsSkybox.h" 53 | #include "4.advanced_opengl/6.2cubemaps_environment_mapping/CubemapsEnvironmentMapping.h" 54 | #include "4.advanced_opengl/8.advanced_glsl_ubo/AdvancedGlslUbo.h" 55 | #include "4.advanced_opengl/9.1geometry_shader_houses/GeometryShaderHouses.h" 56 | #include "4.advanced_opengl/9.2geometry_shader_exploding/GeometryShaderExploding.h" 57 | #include "4.advanced_opengl/9.3geometry_shader_normals/GeometryShaderNormals.h" 58 | #include "4.advanced_opengl/10.1instancing_quads/InstancingQuads.h" 59 | #include "4.advanced_opengl/10.2asteroids/Asteroids.h" 60 | #include "4.advanced_opengl/10.3asteroids_instanced/AsteroidsInstanced.h" 61 | #include "5.advanced_lighting/1.advanced_lighting/AdvancedLighting.h" 62 | 63 | 64 | class MainWindow : public QMainWindow 65 | { 66 | Q_OBJECT 67 | 68 | public: 69 | MainWindow(QMainWindow *parent = nullptr); 70 | ~MainWindow(); 71 | 72 | private: 73 | void showGLWindows(); 74 | void registerMetaObject(); 75 | 76 | private: 77 | QWidget* m_container; 78 | QGridLayout* m_layout; 79 | QComboBox* m_combox; 80 | 81 | QOpenGLWidget* m_openglWidget; 82 | 83 | QList m_metaObjectList; 84 | QMap m_metaObjectMap; 85 | }; 86 | #endif // MAINWINDOW_H 87 | -------------------------------------------------------------------------------- /src/main.cpp: -------------------------------------------------------------------------------- 1 | #include "MainWindow.h" 2 | 3 | #include 4 | 5 | int main(int argc, char *argv[]) 6 | { 7 | QApplication a(argc, argv); 8 | 9 | QSurfaceFormat format; 10 | format.setDepthBufferSize(24); 11 | format.setStencilBufferSize(8); 12 | format.setSamples(4); 13 | //版本要一致 : class MyWidget : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core 14 | format.setVersion(3, 3); 15 | format.setProfile(QSurfaceFormat::CoreProfile); 16 | format.setOption(QSurfaceFormat::DebugContext); 17 | QSurfaceFormat::setDefaultFormat(format); 18 | 19 | MainWindow w; 20 | w.resize(800, 600); 21 | w.show(); 22 | return a.exec(); 23 | } 24 | -------------------------------------------------------------------------------- /src/utils/CameraUtil.h: -------------------------------------------------------------------------------- 1 | #ifndef CAMERAUTIL_H 2 | #define CAMERAUTIL_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | 14 | //https://blog.csdn.net/qq_40946921/article/details/106014771 15 | class CameraUtil 16 | { 17 | public: 18 | enum CameraMovement{ 19 | FORWARD, 20 | BACKWARD, 21 | LEFT, 22 | RIGHT, 23 | DISABLE, 24 | ENABLE 25 | }; 26 | CameraUtil(QWidget* widget); 27 | //初始化 28 | void init(); 29 | //处理事件 30 | void handle(QEvent* event); 31 | //设置按键响应 32 | void setKeyMap(CameraMovement key, Qt::Key value); 33 | //移动速度 34 | float getMoveSpeed() const; 35 | void setMoveSpeed(float value); 36 | //鼠标灵敏度 37 | float getSensitivity() const; 38 | void setSensitivity(float value); 39 | //偏航角 40 | float getYaw() const; 41 | void setYaw(float value); 42 | //俯视角 43 | float getPitch() const; 44 | void setPitch(float value); 45 | void setPitchConstrained(bool flag); 46 | //fov 47 | float getFov() const; 48 | void setFov(float value); 49 | //摄像机位置 50 | QVector3D getCameraPos() const; 51 | void setCameraPos(const QVector3D& value); 52 | // 53 | QVector3D getCameraUp() const; 54 | void setCameraUp(const QVector3D& value); 55 | //摄像机方向,由于方向是由偏航角和俯视角得到的,故不提供set函数 56 | QVector3D getCameraDirection() const; 57 | //MVP 58 | QMatrix4x4 getViewMatrix(); 59 | 60 | private: 61 | void handleMouseMoveEvent(QMouseEvent* event); 62 | void handleWheelEvent(QWheelEvent* event); 63 | void handleTimerEvent(QTimerEvent* event); 64 | void calculateCameraDirection(); 65 | void calculateViewMatrix(); 66 | 67 | private: 68 | QWidget* m_widget; 69 | 70 | float m_sensitivity; 71 | float m_yaw; 72 | float m_pitch; 73 | float m_fov; 74 | 75 | QMatrix4x4 m_view; 76 | 77 | QVector3D m_cameraPos; 78 | QVector3D m_cameraDirection; 79 | QVector3D m_cameraUp; 80 | 81 | QMap m_keyMap; 82 | QSet m_pressedKeys; 83 | int m_timerId; 84 | float m_deltaTime;//当前帧与上一帧的时间差 85 | float m_lastFrame;//上一帧的时间 86 | float m_moveSpeed; 87 | 88 | QPoint m_lastMousePos; 89 | 90 | bool m_isMouseMoveDisabled; 91 | bool m_isPitchConstrained; 92 | }; 93 | 94 | #endif // CAMERAUTIL_H 95 | -------------------------------------------------------------------------------- /src/utils/CubemapTextureUtil.h: -------------------------------------------------------------------------------- 1 | #ifndef CUBEMAPTEXTUREUTIL_H 2 | #define CUBEMAPTEXTUREUTIL_H 3 | 4 | #include 5 | 6 | // I tried RGB format and got a black screen here, which seems that cubemap wasn't allocated successfully 7 | class CubemapTextureUtil : public QOpenGLTexture 8 | { 9 | public: 10 | CubemapTextureUtil(QString pathPositiveX, 11 | QString pathPositiveY, 12 | QString pathPositiveZ, 13 | QString pathNegativeX, 14 | QString pathNegativeY, 15 | QString pathNegativeZ) 16 | : QOpenGLTexture(QOpenGLTexture::TargetCubeMap) 17 | { 18 | // load image 19 | auto posx = QImage(pathPositiveX).convertToFormat(QImage::Format_RGBA8888); 20 | auto posy = QImage(pathPositiveY).convertToFormat(QImage::Format_RGBA8888); 21 | auto posz = QImage(pathPositiveZ).convertToFormat(QImage::Format_RGBA8888); 22 | auto negx = QImage(pathNegativeX).convertToFormat(QImage::Format_RGBA8888); 23 | auto negy = QImage(pathNegativeY).convertToFormat(QImage::Format_RGBA8888); 24 | auto negz = QImage(pathNegativeZ).convertToFormat(QImage::Format_RGBA8888); 25 | // create and allocateStorage 26 | this->create(); 27 | this->setSize(posx.width(), posx.height(), posx.depth()); 28 | this->setFormat(QOpenGLTexture::RGBA8_UNorm); 29 | this->allocateStorage(QOpenGLTexture::RGBA, QOpenGLTexture::UInt8); 30 | this->setData(0, 0, QOpenGLTexture::CubeMapPositiveX, QOpenGLTexture::RGBA, QOpenGLTexture::UInt8, posx.constBits()); 31 | this->setData(0, 0, QOpenGLTexture::CubeMapPositiveY, QOpenGLTexture::RGBA, QOpenGLTexture::UInt8, posy.constBits()); 32 | this->setData(0, 0, QOpenGLTexture::CubeMapPositiveZ, QOpenGLTexture::RGBA, QOpenGLTexture::UInt8, posz.constBits()); 33 | this->setData(0, 0, QOpenGLTexture::CubeMapNegativeX, QOpenGLTexture::RGBA, QOpenGLTexture::UInt8, negx.constBits()); 34 | this->setData(0, 0, QOpenGLTexture::CubeMapNegativeY, QOpenGLTexture::RGBA, QOpenGLTexture::UInt8, negy.constBits()); 35 | this->setData(0, 0, QOpenGLTexture::CubeMapNegativeZ, QOpenGLTexture::RGBA, QOpenGLTexture::UInt8, negz.constBits()); 36 | } 37 | }; 38 | 39 | #endif // CUBEMAPTEXTUREUTIL_H 40 | -------------------------------------------------------------------------------- /src/utils/Mesh.cpp: -------------------------------------------------------------------------------- 1 | 2 | #include "mesh.h" 3 | #include 4 | 5 | Mesh::Mesh(QOpenGLFunctions* glFunc) 6 | : m_glFunc(glFunc) 7 | , m_VBO(QOpenGLBuffer::VertexBuffer) 8 | , m_EBO(QOpenGLBuffer::IndexBuffer) 9 | { 10 | 11 | } 12 | 13 | Mesh::~Mesh() 14 | { 15 | 16 | } 17 | 18 | void Mesh::Draw(QOpenGLShaderProgram &shader) 19 | { 20 | unsigned int diffuseNr = 1; 21 | unsigned int specularNr = 1; 22 | unsigned int normalNr = 1; 23 | unsigned int heightNr = 1; 24 | 25 | for (unsigned int i = 0; i < textures.size(); ++i) { 26 | m_glFunc->glActiveTexture(GL_TEXTURE0 + i); // 在绑定之前激活相应的纹理单元 27 | // 获取纹理序号(diffuse_textureN 中的 N) 28 | QString number; 29 | QString name = textures[i]->type; 30 | if (name == "texture_diffuse") 31 | number = QString::number(diffuseNr++); 32 | else if (name == "texture_specular") 33 | number = QString::number(specularNr++); 34 | else if (name == "texture_normal") 35 | number = QString::number(normalNr++); 36 | else if (name == "texture_height") 37 | number = QString::number(heightNr++); 38 | textures[i]->texture.bind(); 39 | shader.setUniformValue((name + number).toStdString().c_str(),i); 40 | } 41 | // 画网格 42 | QOpenGLVertexArrayObject::Binder bind(&m_VAO); 43 | m_glFunc->glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, 0); 44 | } 45 | 46 | void Mesh::Draw(QOpenGLShaderProgram *shader) 47 | { 48 | unsigned int diffuseNr = 1; 49 | unsigned int specularNr = 1; 50 | unsigned int normalNr = 1; 51 | unsigned int heightNr = 1; 52 | 53 | for (unsigned int i = 0; i < textures.size(); ++i) { 54 | m_glFunc->glActiveTexture(GL_TEXTURE0 + i); // 在绑定之前激活相应的纹理单元 55 | // 获取纹理序号(diffuse_textureN 中的 N) 56 | QString number; 57 | QString name = textures[i]->type; 58 | if (name == "texture_diffuse") 59 | number = QString::number(diffuseNr++); 60 | else if (name == "texture_specular") 61 | number = QString::number(specularNr++); 62 | else if (name == "texture_normal") 63 | number = QString::number(normalNr++); 64 | else if (name == "texture_height") 65 | number = QString::number(heightNr++); 66 | textures[i]->texture.bind(); 67 | shader->setUniformValue((name + number).toStdString().c_str(),i); 68 | } 69 | // 画网格 70 | QOpenGLVertexArrayObject::Binder bind(&m_VAO); 71 | m_glFunc->glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, 0); 72 | } 73 | 74 | /*! 75 | * \brief Mesh::setupMesh 绑定顶点和索引 76 | */ 77 | void Mesh::setupMesh() 78 | { 79 | 80 | m_VAO.create(); 81 | QOpenGLVertexArrayObject::Binder vaoBinder(&m_VAO); 82 | 83 | m_VBO.create(); 84 | m_EBO.create(); 85 | 86 | m_VBO.bind(); 87 | m_VBO.allocate(vertices.data(),vertices.size() * sizeof(Vertex)); 88 | 89 | m_EBO.bind(); 90 | m_EBO.allocate(indices.data(),indices.size() * sizeof(unsigned int)); 91 | 92 | 93 | // set the vertex attribute pointers 94 | // vertex Positions 95 | m_glFunc->glEnableVertexAttribArray(0); 96 | m_glFunc->glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)0); 97 | // vertex normals 98 | m_glFunc->glEnableVertexAttribArray(1); 99 | m_glFunc->glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, Normal)); 100 | // vertex texture coords 101 | m_glFunc->glEnableVertexAttribArray(2); 102 | m_glFunc->glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, TexCoords)); 103 | // vertex tangent 104 | m_glFunc->glEnableVertexAttribArray(3); 105 | m_glFunc->glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, Tangent)); 106 | // vertex bitangent 107 | m_glFunc->glEnableVertexAttribArray(4); 108 | m_glFunc->glVertexAttribPointer(4, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, Bitangent)); 109 | } 110 | 111 | QOpenGLVertexArrayObject *Mesh::getVAO() 112 | { 113 | return &m_VAO; 114 | } 115 | -------------------------------------------------------------------------------- /src/utils/Mesh.h: -------------------------------------------------------------------------------- 1 | #ifndef MESH_H 2 | #define MESH_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include "assimp/Importer.hpp" 15 | #include "assimp/scene.h" 16 | #include "assimp/postprocess.h" 17 | 18 | struct Vertex 19 | { 20 | QVector3D Position; 21 | QVector3D Normal; 22 | QVector2D TexCoords; 23 | QVector3D Tangent; 24 | QVector3D Bitangent; 25 | }; 26 | 27 | struct Texture 28 | { 29 | QOpenGLTexture texture; 30 | QString type; 31 | QString path; 32 | Texture():texture(QOpenGLTexture::Target2D){ 33 | texture.create(); 34 | texture.setWrapMode(QOpenGLTexture::DirectionS,QOpenGLTexture::Repeat); 35 | texture.setWrapMode(QOpenGLTexture::DirectionT,QOpenGLTexture::Repeat); 36 | texture.setMinMagFilters(QOpenGLTexture::LinearMipMapLinear,QOpenGLTexture::Linear); 37 | } 38 | }; 39 | 40 | class Mesh { 41 | public: 42 | /* 网格数据 */ 43 | std::vector vertices; //顶点数据 44 | std::vector indices; //索引数组 45 | std::vector textures; //纹理数据 46 | 47 | /* 函数 */ 48 | Mesh(QOpenGLFunctions* glFunc); 49 | ~Mesh(); 50 | 51 | void Draw(QOpenGLShaderProgram& shader); 52 | void Draw(QOpenGLShaderProgram* shader); 53 | void setupMesh(); 54 | QOpenGLVertexArrayObject* getVAO(); 55 | 56 | private: 57 | /* 渲染数据 */ 58 | QOpenGLVertexArrayObject m_VAO; 59 | QOpenGLBuffer m_VBO,m_EBO; 60 | //opengl函数入口 61 | QOpenGLFunctions* m_glFunc; 62 | }; 63 | 64 | #endif // MESH_H 65 | -------------------------------------------------------------------------------- /src/utils/ModelUtil.h: -------------------------------------------------------------------------------- 1 | #ifndef MODEL_H 2 | #define MODEL_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | 10 | #include "mesh.h" 11 | 12 | class ModelUtil 13 | { 14 | public: 15 | ModelUtil(QString path, QOpenGLContext* context); 16 | ~ModelUtil(); 17 | void Draw(QOpenGLShaderProgram& shader); 18 | void Draw(QOpenGLShaderProgram* shader); 19 | void destory(); 20 | QMatrix4x4 getNDCMatrix(); 21 | float getNDCScaleFactor(); 22 | // 数据 23 | std::vector> meshes; //网格 24 | std::vector texturesLoaded; // 缓存已加载的纹理 25 | 26 | private: 27 | // opengl函数入口 28 | QOpenGLContext* m_context; 29 | QDir directory; //模型所在路径 30 | 31 | //递归遍历结点 32 | void processNode(aiNode *node, const aiScene *scene); 33 | //加载网格 34 | std::unique_ptr processMesh(aiMesh *mesh, const aiScene *scene); 35 | //加载材质纹理 36 | std::vector loadMaterialTextures(aiMaterial *mat, aiTextureType type,QString typeName); 37 | 38 | // to NDC 39 | void calculateNDCParam(); 40 | float m_positiveX, m_positiveY, m_positiveZ; 41 | float m_negativeX, m_negativeY, m_negativeZ; 42 | float m_scaleFactor; 43 | QMatrix4x4 m_modelMatrix; 44 | }; 45 | #endif // MODEL_H 46 | -------------------------------------------------------------------------------- /src/utils/OpenGLUniformbufferObject.cpp: -------------------------------------------------------------------------------- 1 | #include "OpenGLUniformbufferObject.h" 2 | 3 | OpenGLUniformbufferObject::OpenGLUniformbufferObject(std::vector shaderIds, QString structName, QStringList elementNames) 4 | : m_shaderIds(shaderIds) 5 | , m_uboStructName(structName) 6 | , m_uboElementNames(elementNames) 7 | , m_ubo(0) 8 | , m_uboSize(0) 9 | { 10 | // get current opengl function 11 | m_glFunc = QOpenGLContext::currentContext()->versionFunctions(); 12 | // get the relevant block indices, and link each shader's uniform block to this uniform binding point 13 | std::vector uniformBlockIndex(m_shaderIds.size()); 14 | for (int i = 0; i < m_shaderIds.size(); ++i) { 15 | uniformBlockIndex[i] = m_glFunc->glGetUniformBlockIndex(m_shaderIds[i], m_uboStructName.toStdString().c_str()); 16 | m_glFunc->glUniformBlockBinding(m_shaderIds[i], uniformBlockIndex[i], 0); 17 | } 18 | // resize 19 | int n = m_uboElementNames.size(); 20 | m_uboIndices.resize(n); 21 | m_uboOffsets.resize(n); 22 | // get information 23 | m_charNames = new char*[n]; 24 | for (int i = 0; i < n; ++i) { 25 | std::string name = m_uboElementNames[i].toStdString(); 26 | m_charNames[i] = new char[name.size() + 1]; // to account for \0 27 | strcpy(m_charNames[i], name.c_str()); 28 | } 29 | 30 | m_glFunc->glGetActiveUniformBlockiv(m_shaderIds[0], uniformBlockIndex[0], GL_UNIFORM_BLOCK_DATA_SIZE, &m_uboSize); 31 | m_glFunc->glGetUniformIndices(m_shaderIds[0], n, m_charNames, m_uboIndices.data()); 32 | m_glFunc->glGetActiveUniformsiv(m_shaderIds[0], n, m_uboIndices.data(), GL_UNIFORM_OFFSET, m_uboOffsets.data()); 33 | } 34 | 35 | OpenGLUniformbufferObject::~OpenGLUniformbufferObject() 36 | { 37 | m_glFunc->glDeleteBuffers(1, &m_ubo); 38 | for (int i = 0; i < m_uboElementNames.size(); ++i) { 39 | delete[] m_charNames[i]; 40 | } 41 | delete[] m_charNames; 42 | } 43 | 44 | void OpenGLUniformbufferObject::create(GLenum usage) 45 | { 46 | if (m_ubo != 0) return; 47 | m_glFunc->glGenBuffers(1, &m_ubo); 48 | m_glFunc->glBindBuffer(GL_UNIFORM_BUFFER, m_ubo); 49 | m_glFunc->glBufferData(GL_UNIFORM_BUFFER, m_uboSize, NULL, usage); 50 | m_glFunc->glBindBuffer(GL_UNIFORM_BUFFER, 0); 51 | m_glFunc->glBindBufferRange(GL_UNIFORM_BUFFER, 0, m_ubo, 0, m_uboSize); 52 | } 53 | 54 | void OpenGLUniformbufferObject::bind() 55 | { 56 | m_glFunc->glBindBuffer(GL_UNIFORM_BUFFER, m_ubo); 57 | } 58 | 59 | void OpenGLUniformbufferObject::release() 60 | { 61 | m_glFunc->glBindBuffer(GL_UNIFORM_BUFFER, 0); 62 | } 63 | 64 | void OpenGLUniformbufferObject::setData(int index, const GLvoid *data) 65 | { 66 | int n = m_uboElementNames.size(); 67 | if (index >= n) return; 68 | 69 | GLintptr offset = m_uboOffsets[index]; 70 | GLsizeiptr size; 71 | if (index < n - 1) { 72 | size = m_uboOffsets[index + 1]; 73 | } else { 74 | size = m_uboSize - offset; 75 | } 76 | m_glFunc->glBufferSubData(GL_UNIFORM_BUFFER, offset, size, data); 77 | } 78 | -------------------------------------------------------------------------------- /src/utils/OpenGLUniformbufferObject.h: -------------------------------------------------------------------------------- 1 | #ifndef OPENGLUNIFORMBUFFEROBJECT_H 2 | #define OPENGLUNIFORMBUFFEROBJECT_H 3 | 4 | #include 5 | #include 6 | 7 | class OpenGLUniformbufferObject 8 | { 9 | public: 10 | // shaderIds : numbers of shaders which has the same structName, must not be empty 11 | OpenGLUniformbufferObject(std::vector shaderIds, QString structName, QStringList elementNames); 12 | ~OpenGLUniformbufferObject(); 13 | // 创建+绑定+解绑 14 | void create(GLenum usage = GL_STATIC_DRAW); 15 | void bind(); 16 | void release(); 17 | // 设置某一个数据 18 | void setData(int index, const GLvoid* data); 19 | 20 | private: 21 | QOpenGLFunctions_3_3_Core* m_glFunc; 22 | // UBO 23 | std::vector m_shaderIds; 24 | QString m_uboStructName; 25 | QStringList m_uboElementNames; 26 | char** m_charNames; 27 | 28 | GLuint m_ubo; 29 | GLint m_uboSize; 30 | std::vector m_uboOffsets; 31 | std::vector m_uboIndices; 32 | }; 33 | 34 | #endif // OPENGLUNIFORMBUFFEROBJECT_H 35 | -------------------------------------------------------------------------------- /src/utils/ShaderUtil.h: -------------------------------------------------------------------------------- 1 | #ifndef SHADERUTIL_H 2 | #define SHADERUTIL_H 3 | 4 | #include 5 | 6 | 7 | class ShaderUtil : public QOpenGLShaderProgram 8 | { 9 | public: 10 | ShaderUtil(QString vertexPath, QString fragmentPath) { 11 | bool result = true; 12 | result = addShaderFromSourceFile(QOpenGLShader::Vertex, vertexPath); 13 | if(!result){ 14 | qDebug() << log(); 15 | } 16 | result = addShaderFromSourceFile(QOpenGLShader::Fragment, fragmentPath); 17 | if(!result){ 18 | qDebug() << log(); 19 | } 20 | result = link(); 21 | if(!result){ 22 | qDebug() << log(); 23 | } 24 | } 25 | ShaderUtil(QString vertexPath, QString fragmentPath, QString geometryPath) { 26 | bool result = true; 27 | result = addShaderFromSourceFile(QOpenGLShader::Vertex, vertexPath); 28 | if(!result){ 29 | qDebug() << log(); 30 | } 31 | result = addShaderFromSourceFile(QOpenGLShader::Fragment, fragmentPath); 32 | if(!result){ 33 | qDebug() << log(); 34 | } 35 | result = addShaderFromSourceFile(QOpenGLShader::Geometry, geometryPath); 36 | if(!result){ 37 | qDebug() << log(); 38 | } 39 | result = link(); 40 | if(!result){ 41 | qDebug() << log(); 42 | } 43 | } 44 | }; 45 | 46 | #endif // SHADERUTIL_H 47 | --------------------------------------------------------------------------------