From 87c60187bf0343586342adf8b447baed89ab86c2 Mon Sep 17 00:00:00 2001 From: Derek Christ Date: Sun, 11 Jul 2021 14:47:39 +0200 Subject: [PATCH] Use geometry shader for widgets. --- data/shaderPrograms.json | 3 +- data/shaders/menu.frag | 1 + data/shaders/menu.geom | 41 ++++++++++++++++++++++++++ data/shaders/menu.vert | 16 ++++++---- data/shaders/postprocessing.vert | 7 +++-- src/Controller.cpp | 1 + src/JsonParser.cpp | 8 ----- src/ShaderProgram.cpp | 6 ++++ src/ShaderProgram.h | 1 + src/Widget.cpp | 50 +++++++++++++++----------------- src/Widget.h | 4 --- 11 files changed, 90 insertions(+), 48 deletions(-) create mode 100644 data/shaders/menu.geom diff --git a/data/shaderPrograms.json b/data/shaderPrograms.json index 5faec74..7fbab54 100644 --- a/data/shaderPrograms.json +++ b/data/shaderPrograms.json @@ -23,7 +23,8 @@ { "unique_name": "menuProgram", "vertexPath": "data/shaders/menu.vert", - "fragmentPath": "data/shaders/menu.frag" + "fragmentPath": "data/shaders/menu.frag", + "geometryPath": "data/shaders/menu.geom" }, { "unique_name": "directionalShadowDepthProgram", diff --git a/data/shaders/menu.frag b/data/shaders/menu.frag index 08b96d9..59271de 100644 --- a/data/shaders/menu.frag +++ b/data/shaders/menu.frag @@ -13,4 +13,5 @@ uniform Material u_material; void main() { f_color = texture(u_material.texture_diffuse0, v_texCoord); + // f_color = vec4(1.0, 0.0, 0.0, 0.5); } diff --git a/data/shaders/menu.geom b/data/shaders/menu.geom new file mode 100644 index 0000000..b0cecc4 --- /dev/null +++ b/data/shaders/menu.geom @@ -0,0 +1,41 @@ +#version 330 core + +layout(points) in; +layout(triangle_strip, max_vertices = 4) out; + +struct WidgetData +{ + vec2 position; + vec2 dimensions; +}; +uniform WidgetData u_widgetData; + +out vec2 v_texCoord; + +void main() +{ + float glWidth = u_widgetData.dimensions.x * 2.0f; + float glHeight = u_widgetData.dimensions.y * 2.0f; + + vec4 offset = vec4(0.0, 0.0, 0.0, 0.0); + gl_Position = gl_in[0].gl_Position + offset; + v_texCoord = vec2(0.0, 0.0); + EmitVertex(); + + offset = vec4(glWidth, 0.0, 0.0, 0.0); + gl_Position = gl_in[0].gl_Position + offset; + v_texCoord = vec2(1.0, 0.0); + EmitVertex(); + + offset = vec4(0.0, glHeight, 0.0, 0.0); + gl_Position = gl_in[0].gl_Position + offset; + v_texCoord = vec2(0.0, 1.0); + EmitVertex(); + + offset = vec4(glWidth, glHeight, 0.0, 0.0); + gl_Position = gl_in[0].gl_Position + offset; + v_texCoord = vec2(1.0, 1.0); + EmitVertex(); + + EndPrimitive(); +} \ No newline at end of file diff --git a/data/shaders/menu.vert b/data/shaders/menu.vert index 6ebaada..58eb2d3 100644 --- a/data/shaders/menu.vert +++ b/data/shaders/menu.vert @@ -1,12 +1,16 @@ #version 330 core -layout(location = 0) in vec3 a_position; -layout(location = 1) in vec2 a_texCoord; - -out vec2 v_texCoord; +struct WidgetData +{ + vec2 position; + vec2 dimensions; +}; +uniform WidgetData u_widgetData; void main() { - v_texCoord = a_texCoord; - gl_Position = vec4(a_position, 1.0); + float glPosX = u_widgetData.position.x * 2.0f - 1.0f; + float glPosY = u_widgetData.position.y * 2.0f - 1.0f; + + gl_Position = vec4(glPosX, glPosY, 0, 1); } diff --git a/data/shaders/postprocessing.vert b/data/shaders/postprocessing.vert index ef49abd..420b85f 100644 --- a/data/shaders/postprocessing.vert +++ b/data/shaders/postprocessing.vert @@ -2,10 +2,11 @@ out vec2 v_tex_coords; -void main() { +void main() +{ float x = -1.0 + float((gl_VertexID & 1) << 2); float y = -1.0 + float((gl_VertexID & 2) << 1); - v_tex_coords.x = (x+1.0)*0.5; - v_tex_coords.y = (y+1.0)*0.5; + v_tex_coords.x = (x + 1.0) * 0.5; + v_tex_coords.y = (y + 1.0) * 0.5; gl_Position = vec4(x, y, 0, 1); } diff --git a/src/Controller.cpp b/src/Controller.cpp index 8bee1c9..4131750 100644 --- a/src/Controller.cpp +++ b/src/Controller.cpp @@ -41,6 +41,7 @@ Controller::Controller() : m_gameWindow(std::unique_ptr(new Window)) for (auto &prototype : shaderProgramPrototypes) { m_shaderPrograms.push_back(new ShaderProgram(prototype)); + std::cout << "Loaded ShaderProgram \"" << prototype.name << "\"" << std::endl; } m_postProcessFrameBuffer = new FrameBuffer(m_gameWindow->getWindowWidth(), m_gameWindow->getWindowHeight(), diff --git a/src/JsonParser.cpp b/src/JsonParser.cpp index 46f5ca5..ac12726 100644 --- a/src/JsonParser.cpp +++ b/src/JsonParser.cpp @@ -1,11 +1,4 @@ #include "JsonParser.h" -#include "Entity.h" -#include "Light.h" -#include "Model.h" -#include "Screen.h" -#include "ShaderProgram.h" -#include "Texture.h" -#include "Widget.h" #include #include @@ -103,7 +96,6 @@ std::vector JsonParser::getShaderProgramPrototypes() shaderProgram_geometryPath}; prototypes.push_back(prototype); - // std::cout << "Loaded ShaderProgram \"" << shaderProgram_name << "\"" << std::endl; } return prototypes; diff --git a/src/ShaderProgram.cpp b/src/ShaderProgram.cpp index 2f5a39f..babe60b 100644 --- a/src/ShaderProgram.cpp +++ b/src/ShaderProgram.cpp @@ -128,6 +128,12 @@ void ShaderProgram::setUniform(const std::string &name, float value) const glUniform1f(location, value); } +void ShaderProgram::setUniform(const std::string &name, glm::vec2 vector) const +{ + GLint location = retrieveUniformLocation(name); + glUniform2f(location, vector.x, vector.y); +} + void ShaderProgram::setUniform(const std::string &name, glm::vec3 vector) const { GLint location = retrieveUniformLocation(name); diff --git a/src/ShaderProgram.h b/src/ShaderProgram.h index fb86f7b..1155cc8 100644 --- a/src/ShaderProgram.h +++ b/src/ShaderProgram.h @@ -28,6 +28,7 @@ public: void setUniform(const std::string &name, bool value) const; void setUniform(const std::string &name, int value) const; void setUniform(const std::string &name, float value) const; + void setUniform(const std::string &name, glm::vec2 vector) const; void setUniform(const std::string &name, glm::vec3 vector) const; void setUniform(const std::string &name, glm::mat3 matrix) const; void setUniform(const std::string &name, glm::mat4 matrix) const; diff --git a/src/Widget.cpp b/src/Widget.cpp index a8002a4..5f16dba 100644 --- a/src/Widget.cpp +++ b/src/Widget.cpp @@ -12,35 +12,12 @@ Widget::Widget(Prototype prototype, Texture *texture) m_callbackId(prototype.callBackId) { m_widgetTextures.push_back(texture); - - double widgetVerticesData[12] = { - 2 * (m_position.x + m_dimensions.x) - 1.0f, - 2 * (m_position.y) - 1.0f, - 0.0f, // Bottom right - 2 * (m_position.x) - 1.0f, - 2 * (m_position.y + m_dimensions.y) - 1.0f, - 0.0f, // Top left - 2 * (m_position.x) - 1.0f, - 2 * (m_position.y) - 1.0f, - 0.0f, // Bottom left - 2 * (m_position.x + m_dimensions.x) - 1.0f, - 2 * (m_position.y + m_dimensions.y) - 1.0f, - 0.0f // Top right - }; - - unsigned int widgetIndicesData[6] = {0, 1, 2, 0, 3, 1}; - - float widgetTextureCoordinates[8] = {1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f}; - - m_widgetVertices = VertexArray::createVertices(widgetVerticesData, 12, widgetTextureCoordinates); - m_widgetIndices.assign(widgetIndicesData, widgetIndicesData + 6); - m_widgetMesh = new Mesh(m_widgetVertices, m_widgetIndices, m_widgetTextures); - m_widgetMesh->initializeOnGPU(); } Widget::~Widget() { - delete m_widgetMesh; + for (auto &texture : m_widgetTextures) + delete texture; } std::string Widget::getUniqueName() @@ -56,7 +33,28 @@ uint16_t Widget::getCallbackId() void Widget::draw(ShaderProgram *shaderProgram) { shaderProgram->bind(); - m_widgetMesh->draw(shaderProgram); + shaderProgram->setUniform("u_widgetData.position", m_position); + shaderProgram->setUniform("u_widgetData.dimensions", m_dimensions); + + GLint wireframe; + glGetIntegerv(GL_POLYGON_MODE, &wireframe); + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, m_widgetTextures[0]->getTextureId()); + + GLint location = glGetUniformLocation(shaderProgram->getShaderProgramId(), "u_texture"); + glUniform1i(location, 0); + + // A VAO is necessary although no data is stored in it + GLuint temp_vao; + glGenVertexArrays(1, &temp_vao); + glBindVertexArray(temp_vao); + glDrawArrays(GL_POINTS, 0, 3); + glBindVertexArray(0); + + glPolygonMode(GL_FRONT_AND_BACK, wireframe); + shaderProgram->unbind(); } diff --git a/src/Widget.h b/src/Widget.h index d62555f..c1ad577 100644 --- a/src/Widget.h +++ b/src/Widget.h @@ -43,9 +43,5 @@ private: uint16_t m_callbackId; - std::vector m_widgetVertices; - std::vector m_widgetIndices; std::vector m_widgetTextures; - - Mesh *m_widgetMesh; };