From 399807a1b624e02e80ff1e98384c29ae37b7464d Mon Sep 17 00:00:00 2001 From: Stanislav Kaliuk Date: Fri, 3 Apr 2020 00:35:01 +0300 Subject: [PATCH 1/2] Add Restart Primitives project --- OpenGLTechTalks/Basic/src/Basic.h | 3 +- OpenGLTechTalks/RestartPrimitives/rpF.frag | 7 ++ OpenGLTechTalks/RestartPrimitives/rpV.vert | 9 ++ .../RestartPrimitives/src/main.cpp | 119 ++++++++++++++++++ OpenGLTechTalks/premake5.lua | 63 ++++++++-- 5 files changed, 189 insertions(+), 12 deletions(-) create mode 100644 OpenGLTechTalks/RestartPrimitives/rpF.frag create mode 100644 OpenGLTechTalks/RestartPrimitives/rpV.vert create mode 100644 OpenGLTechTalks/RestartPrimitives/src/main.cpp diff --git a/OpenGLTechTalks/Basic/src/Basic.h b/OpenGLTechTalks/Basic/src/Basic.h index f1ac6b0..2ff6b3b 100644 --- a/OpenGLTechTalks/Basic/src/Basic.h +++ b/OpenGLTechTalks/Basic/src/Basic.h @@ -1,4 +1,5 @@ #pragma once #include "EntryPoint.h" #include "IRenderer.h" -#include "Application.h" \ No newline at end of file +#include "Application.h" +#include "Shader.h" \ No newline at end of file diff --git a/OpenGLTechTalks/RestartPrimitives/rpF.frag b/OpenGLTechTalks/RestartPrimitives/rpF.frag new file mode 100644 index 0000000..7ff3089 --- /dev/null +++ b/OpenGLTechTalks/RestartPrimitives/rpF.frag @@ -0,0 +1,7 @@ +#version 460 +in vec4 oColor; +out vec4 color; +void main() +{ + color = oColor; +} diff --git a/OpenGLTechTalks/RestartPrimitives/rpV.vert b/OpenGLTechTalks/RestartPrimitives/rpV.vert new file mode 100644 index 0000000..781aca6 --- /dev/null +++ b/OpenGLTechTalks/RestartPrimitives/rpV.vert @@ -0,0 +1,9 @@ +#version 460 +layout(location = 0) in vec4 aPos; +layout(location = 1) in vec4 aColor; +out vec4 oColor; +void main() +{ + gl_Position = aPos; + oColor = aColor; +} diff --git a/OpenGLTechTalks/RestartPrimitives/src/main.cpp b/OpenGLTechTalks/RestartPrimitives/src/main.cpp new file mode 100644 index 0000000..3be02e5 --- /dev/null +++ b/OpenGLTechTalks/RestartPrimitives/src/main.cpp @@ -0,0 +1,119 @@ +#include +#include "Basic.h" +#include + +class RestartPrimitivesRenderer final : public IRenderer +{ + +private: + GLuint vertexBuffer, elementBuffer, vertexArray; + core::Shader* shader; + GLsizei indiciesAmount; +protected: + void Init() override + { + + shader = new core::Shader("rpV.vert","rpF.frag"); + + + static const GLfloat cube_Pos[] = + { + -0.5f, 0.0f, 0.0f, 1.0f, + -0.3f, -0.2f, 0.0f, 1.0f, + -0.4f, 0.1f, 0.0f, 1.0f, + -0.2f, 0.5f, 0.0f, 1.0f, + 0.0f, 0.5f, 0.0f, 1.0f, + 0.0f, -0.5f, 0.0f, 1.0f, + 0.8f, 0.5f, 0.0f, 1.0f, + 0.6f, -0.5f, 0.0f, 1.0f, + }; + + static const GLfloat cube_colors[] = + { + 1.0f, 1.0f, 1.0f, 1.0f, + 1.0f, 1.0f, 0.0f, 1.0f, + 1.0f, 0.0f, 1.0f, 1.0f, + 1.0f, 0.0f, 0.0f, 1.0f, + 0.0f, 1.0f, 1.0f, 1.0f, + 0.0f, 1.0f, 0.0f, 1.0f, + 0.0f, 0.0f, 1.0f, 1.0f, + 0.5f, 0.5f, 0.5f, 1.0f, + }; + + static const GLushort cube_indices[] = + { + 0, 2, 1, 0xFF, 1, 4, 3, 0, + 0xFF, + 6, 7, 5, 0xFF, 5, 4, 7, 0xFF + }; + + indiciesAmount = sizeof(cube_indices) / sizeof(cube_indices[0]); + + glGenBuffers(1, &elementBuffer); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementBuffer); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(cube_indices), cube_indices, GL_STATIC_DRAW); + + glGenVertexArrays(1, &vertexArray); + glBindVertexArray(vertexArray); + + glGenBuffers(1, &vertexBuffer); + glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); + glBufferData(GL_ARRAY_BUFFER, sizeof(cube_Pos) + sizeof(cube_colors), NULL, GL_STATIC_DRAW); + glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(cube_Pos), cube_Pos); + glBufferSubData(GL_ARRAY_BUFFER, sizeof(cube_Pos), sizeof(cube_colors), cube_colors); + + glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, nullptr); + glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, (const GLvoid*)sizeof(cube_Pos)); + + glEnableVertexAttribArray(0); + glEnableVertexAttribArray(1); + + } + + void Update(float deltaTime) override + { + glClearColor(0.1f, 0.1f, 0.1f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + shader->SetActive(true); + + glBindVertexArray(vertexArray); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementBuffer); + //glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + glEnable(GL_PRIMITIVE_RESTART); + glPrimitiveRestartIndex(0xFF); + glDrawElements(GL_TRIANGLE_STRIP, indiciesAmount, GL_UNSIGNED_SHORT, NULL); + glDisable(GL_PRIMITIVE_RESTART); + } + + void PostUpdate(float) override + { + } + + void Dispose() override + { + glDeleteVertexArrays(1, &vertexArray); + glDeleteBuffers(1, &vertexBuffer); + glDeleteBuffers(1, &elementBuffer); + delete shader; + } + + void SetViewport(uint32_t width, uint32_t height) override + { + glViewport(0, 0, width, height); + } +}; + +class RestartPrimitivesApp : public Application +{ +public: + RestartPrimitivesApp(IRenderer* render, const WindowData& windowData) : Application(render, windowData) + { + + } +}; + +Application* CreateApplication() +{ + return new RestartPrimitivesApp(new RestartPrimitivesRenderer(), WindowData("glRestartPromitives", 800, 600)); +} \ No newline at end of file diff --git a/OpenGLTechTalks/premake5.lua b/OpenGLTechTalks/premake5.lua index 45710a2..4957cbb 100644 --- a/OpenGLTechTalks/premake5.lua +++ b/OpenGLTechTalks/premake5.lua @@ -89,7 +89,7 @@ project "DrawArrays" { "DrawArrays/src", "Basic/src", - "%{IncludeDir.GLFW}", + "%{IncludeDir.GLFW}", "%{IncludeDir.Glad}" } @@ -129,7 +129,7 @@ project "MultiDrawArrays" { "MultiDrawArrays/src", "Basic/src", - "%{IncludeDir.GLFW}", + "%{IncludeDir.GLFW}", "%{IncludeDir.Glad}" } @@ -169,7 +169,7 @@ project "DrawElements" { "DrawElements/src", "Basic/src", - "%{IncludeDir.GLFW}", + "%{IncludeDir.GLFW}", "%{IncludeDir.Glad}" } @@ -209,7 +209,7 @@ project "MultiDrawElements" { "MultiDrawElements/src", "Basic/src", - "%{IncludeDir.GLFW}", + "%{IncludeDir.GLFW}", "%{IncludeDir.Glad}" } @@ -228,7 +228,7 @@ project "MultiDrawElements" filter "configurations:Release" runtime "Release" optimize "On" - + project "DrawElementsBase" location "DrawElementsBase" kind "ConsoleApp" @@ -249,8 +249,8 @@ project "DrawElementsBase" { "DrawElementsBase/src", "Basic/src", - "%{IncludeDir.GLFW}", - "%{IncludeDir.Glad}", + "%{IncludeDir.GLFW}", + "%{IncludeDir.Glad}", "%{IncludeDir.glm}" } @@ -269,7 +269,7 @@ project "DrawElementsBase" filter "configurations:Release" runtime "Release" optimize "On" - + project "Uniforms" location "Uniforms" kind "ConsoleApp" @@ -290,8 +290,8 @@ project "Uniforms" { "DrawElementsBase/src", "Basic/src", - "%{IncludeDir.GLFW}", - "%{IncludeDir.Glad}", + "%{IncludeDir.GLFW}", + "%{IncludeDir.Glad}", "%{IncludeDir.glm}" } @@ -309,4 +309,45 @@ project "Uniforms" filter "configurations:Release" runtime "Release" - optimize "On" \ No newline at end of file + optimize "On" + +project "RestartPrimitives" + location "RestartPrimitives" + kind "ConsoleApp" + language "C++" + cppdialect "C++17" + staticruntime "on" + + targetdir ("bin/" .. outputdir .. "/%{prj.name}") + objdir ("bin-int/" .. outputdir .. "/%{prj.name}") + + files + { + "%{prj.name}/src/**.h", + "%{prj.name}/src/**.cpp", + } + + includedirs + { + "RestartPrimitives/src", + "Basic/src", + "%{IncludeDir.GLFW}", + "%{IncludeDir.Glad}", + "%{IncludeDir.glm}" + } + + links + { + "Basic" + } + + filter "system:windows" + systemversion "latest" + + filter "configurations:Debug" + runtime "Debug" + symbols "On" + + filter "configurations:Release" + runtime "Release" + optimize "On" From 6615c1317061979237b03de517a3eae62638e885 Mon Sep 17 00:00:00 2001 From: Stanislav Kaliuk Date: Wed, 22 Apr 2020 21:53:51 +0300 Subject: [PATCH 2/2] Update main.cpp --- .../RestartPrimitives/src/main.cpp | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/OpenGLTechTalks/RestartPrimitives/src/main.cpp b/OpenGLTechTalks/RestartPrimitives/src/main.cpp index 3be02e5..caab5d3 100644 --- a/OpenGLTechTalks/RestartPrimitives/src/main.cpp +++ b/OpenGLTechTalks/RestartPrimitives/src/main.cpp @@ -2,6 +2,8 @@ #include "Basic.h" #include +#define USE_FIXED_INDEX 0 + class RestartPrimitivesRenderer final : public IRenderer { @@ -42,9 +44,9 @@ class RestartPrimitivesRenderer final : public IRenderer static const GLushort cube_indices[] = { - 0, 2, 1, 0xFF, 1, 4, 3, 0, - 0xFF, - 6, 7, 5, 0xFF, 5, 4, 7, 0xFF + 0, 2, 1, 0xFFFF, 1, 4, 3, 0, + 0xFFFF, + 6, 7, 5, 0xFFFF, 5, 4, 7, 0xFFFF }; indiciesAmount = sizeof(cube_indices) / sizeof(cube_indices[0]); @@ -79,11 +81,17 @@ class RestartPrimitivesRenderer final : public IRenderer glBindVertexArray(vertexArray); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementBuffer); - //glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); - glEnable(GL_PRIMITIVE_RESTART); - glPrimitiveRestartIndex(0xFF); + +#if USE_FIXED_INDEX + glEnable(GL_PRIMITIVE_RESTART_FIXED_INDEX); + glDrawElements(GL_TRIANGLE_STRIP, indiciesAmount, GL_UNSIGNED_SHORT, NULL); + glDisable(GL_PRIMITIVE_RESTART_FIXED_INDEX); +#else + glEnable(GL_PRIMITIVE_RESTART_INDEX); + glPrimitiveRestartIndex(0xFFFF); glDrawElements(GL_TRIANGLE_STRIP, indiciesAmount, GL_UNSIGNED_SHORT, NULL); - glDisable(GL_PRIMITIVE_RESTART); + glDisable(GL_PRIMITIVE_RESTART_INDEX); +#endif } void PostUpdate(float) override