From 4ff3cf6c5c7ce57a377af25ca50f2301871f0499 Mon Sep 17 00:00:00 2001 From: Dominic Masters Date: Tue, 25 Feb 2025 11:20:05 -0600 Subject: [PATCH] Shader working. --- src/duskgl/display/render.c | 3 ++ src/duskgl/display/shader/CMakeLists.txt | 3 +- .../display/shader/entityshader/entity.glsl | 27 ----------- .../shader/entityshader/entity_frag.glsl | 15 ++---- .../shader/entityshader/entity_vert.glsl | 36 ++++----------- .../shader/entityshader/entityshader.c | 10 ++++ .../shader/entityshader/entityshader.h | 7 ++- .../display/shader/fragments/CMakeLists.txt | 10 ++++ .../display/shader/fragments/transforms.c | 46 +++++++++++++++++++ .../display/shader/fragments/transforms.glsl | 4 +- .../display/shader/fragments/transforms.h | 35 ++++++++++++++ src/duskgl/display/shader/shadermanager.c | 17 ++++++- src/duskgl/display/shader/shadermanager.h | 10 ++-- src/duskgl/overworld/overworld.c | 5 +- src/duskglfw/display/window.h | 4 +- 15 files changed, 154 insertions(+), 78 deletions(-) delete mode 100644 src/duskgl/display/shader/entityshader/entity.glsl create mode 100644 src/duskgl/display/shader/fragments/CMakeLists.txt create mode 100644 src/duskgl/display/shader/fragments/transforms.c create mode 100644 src/duskgl/display/shader/fragments/transforms.h diff --git a/src/duskgl/display/render.c b/src/duskgl/display/render.c index c77974c..37480f4 100644 --- a/src/duskgl/display/render.c +++ b/src/duskgl/display/render.c @@ -21,6 +21,9 @@ void renderInit() { } void renderUpdate() { + // Update shader stuff + shaderManagerUpdate(); + // Hand off to the scene to do its rendering. sceneRender(); } diff --git a/src/duskgl/display/shader/CMakeLists.txt b/src/duskgl/display/shader/CMakeLists.txt index 6da081e..aaf48bf 100644 --- a/src/duskgl/display/shader/CMakeLists.txt +++ b/src/duskgl/display/shader/CMakeLists.txt @@ -12,4 +12,5 @@ target_sources(${DUSK_TARGET_NAME} ) # Subdirs -add_subdirectory(entityshader) \ No newline at end of file +add_subdirectory(entityshader) +add_subdirectory(fragments) \ No newline at end of file diff --git a/src/duskgl/display/shader/entityshader/entity.glsl b/src/duskgl/display/shader/entityshader/entity.glsl deleted file mode 100644 index 4b855d9..0000000 --- a/src/duskgl/display/shader/entityshader/entity.glsl +++ /dev/null @@ -1,27 +0,0 @@ -#include "../fragments/header.glsl" -#include "../fragments/transforms.glsl" - -#define ENTITY_TILE_OFFSET_X (MAP_TILE_WIDTH - ENTITY_WIDTH) / 2 -#define ENTITY_TILE_OFFSET_Y (MAP_TILE_HEIGHT - ENTITY_HEIGHT) / 2 - -struct Entity { - int x; - int y; - int tileset; - int tile; -}; - -layout(std140) uniform b_Data { - Entity entities[MAP_ENTITY_COUNT_MAX]; - int entityCount; -}; - -vec4 entityGetCoordinates(Entity ent) { - int vx = (ent.x * MAP_TILE_WIDTH) + ENTITY_TILE_OFFSET_X; - int vy = (ent.y * MAP_TILE_HEIGHT) + ENTITY_TILE_OFFSET_Y; - return vec4(vx, vy, vx + ENTITY_WIDTH, vy + ENTITY_HEIGHT); -} - -vec4 entityGetUVs(Entity ent) { - return tilesetGetUVsByIndex(ent.tileset, ent.tile); -} \ No newline at end of file diff --git a/src/duskgl/display/shader/entityshader/entity_frag.glsl b/src/duskgl/display/shader/entityshader/entity_frag.glsl index 109aa56..0f36b08 100644 --- a/src/duskgl/display/shader/entityshader/entity_frag.glsl +++ b/src/duskgl/display/shader/entityshader/entity_frag.glsl @@ -1,18 +1,11 @@ -#include "entity.glsl" +#include "../fragments/header.glsl" +// Inputs from vertex shader in vec2 v_TextureCoord; -flat in int v_Entity; +// Frag pixel color out vec4 FragColor; void main() { - Entity e = entities[v_Entity]; - vec4 textureColor = tilesetGetColor(e.tileset, v_TextureCoord); - - // We remove the pink color as transparent - if(textureColor.r == 1.0 && textureColor.g == 0.0 && textureColor.b == 1.0) { - discard; - } - - FragColor = textureColor; + FragColor = vec4(1, 1, 1, 1); } diff --git a/src/duskgl/display/shader/entityshader/entity_vert.glsl b/src/duskgl/display/shader/entityshader/entity_vert.glsl index fda78dd..7d2c4fe 100644 --- a/src/duskgl/display/shader/entityshader/entity_vert.glsl +++ b/src/duskgl/display/shader/entityshader/entity_vert.glsl @@ -1,35 +1,17 @@ -#include "entity.glsl" +#include "../fragments/header.glsl" +#include "../fragments/transforms.glsl" +#include "../fragments/quad.glsl" // Outputs to fragment shader out vec2 v_TextureCoord; -flat out int v_Entity; void main() { - int entityIndex = gl_InstanceID; - int indiceIndex = gl_VertexID % 6; - - Entity entity = entities[entityIndex]; - - vec4 quadPos = entityGetCoordinates(entity); - vec4 quadUVs = entityGetUVs(entity); - - vec2 vertex; - vec2 uv; - if(indiceIndex == 0 || indiceIndex == 4) { - vertex = quadPos.xy; - uv = quadUVs.xy; - } else if(indiceIndex == 1) { - vertex = quadPos.zy; - uv = quadUVs.zy; - } else if(indiceIndex == 2 || indiceIndex == 5) { - vertex = quadPos.zw; - uv = quadUVs.zw; - } else if(indiceIndex == 3) { - vertex = quadPos.xw; - uv = quadUVs.xw; - } + uint instanceIndex = uint(gl_InstanceID); + uint indiceIndex = uint(gl_VertexID % 6); - gl_Position = transforms.projection * transforms.view * vec4(vertex, 0.0, 1.0); + vec2 vert = quadGetVertice(indiceIndex); + vec2 uv = quadGetTextureCoordinate(indiceIndex); + + gl_Position = transforms.projection * transforms.view * vec4(vert, 0.0, 1.0); v_TextureCoord = uv; - v_Entity = entityIndex; } \ No newline at end of file diff --git a/src/duskgl/display/shader/entityshader/entityshader.c b/src/duskgl/display/shader/entityshader/entityshader.c index 7c51b34..2d70cfc 100644 --- a/src/duskgl/display/shader/entityshader/entityshader.c +++ b/src/duskgl/display/shader/entityshader/entityshader.c @@ -10,6 +10,7 @@ #include "entityshader.h" #include "entity_vert.glsl.h" #include "entity_frag.glsl.h" +#include "display/shader/fragments/transforms.h" entityshader_t ENTITY_SHADER; @@ -23,10 +24,19 @@ void entityShaderInit() { ); // Uniform buffers + ENTITY_SHADER.transformsBlock = shaderGetBlock( + &ENTITY_SHADER.shader, + TRANSFORMS_BLOCK_NAME + ); // Uniforms } +void entityShaderUse() { + shaderUse(&ENTITY_SHADER.shader); + shaderBufferBindToBlock(&TRANSFORMS_BUFFER, ENTITY_SHADER.transformsBlock); +} + void entityShaderDispose() { shaderDispose(&ENTITY_SHADER.shader); } \ No newline at end of file diff --git a/src/duskgl/display/shader/entityshader/entityshader.h b/src/duskgl/display/shader/entityshader/entityshader.h index 63f72b1..7b7af9c 100644 --- a/src/duskgl/display/shader/entityshader/entityshader.h +++ b/src/duskgl/display/shader/entityshader/entityshader.h @@ -12,7 +12,7 @@ typedef struct { shader_t shader; // GLuint dataBlock; - // GLuint transformsBlock; + GLuint transformsBlock; // GLuint tilesetsBlock; // GLuint uniformTilesetTextures; @@ -25,6 +25,11 @@ extern entityshader_t ENTITY_SHADER; */ void entityShaderInit(); +/** + * Uses the entity shader. + */ +void entityShaderUse(); + /** * Disposes of the entity shader. */ diff --git a/src/duskgl/display/shader/fragments/CMakeLists.txt b/src/duskgl/display/shader/fragments/CMakeLists.txt new file mode 100644 index 0000000..b2a310b --- /dev/null +++ b/src/duskgl/display/shader/fragments/CMakeLists.txt @@ -0,0 +1,10 @@ +# Copyright (c) 2025 Dominic Masters +# +# This software is released under the MIT License. +# https://opensource.org/licenses/MIT + +# Sources +target_sources(${DUSK_TARGET_NAME} + PRIVATE + transforms.c +) \ No newline at end of file diff --git a/src/duskgl/display/shader/fragments/transforms.c b/src/duskgl/display/shader/fragments/transforms.c new file mode 100644 index 0000000..9876236 --- /dev/null +++ b/src/duskgl/display/shader/fragments/transforms.c @@ -0,0 +1,46 @@ +/** + * Copyright (c) 2025 Dominic Masters + * + * This software is released under the MIT License. + * https://opensource.org/licenses/MIT + */ + +#include "transforms.h" +#include "display/window.h" + +shaderbuffer_t TRANSFORMS_BUFFER; +transformsdata_t TRANSFORMS_DATA; + +void transformsInit() { + shaderBufferInit(&TRANSFORMS_BUFFER, sizeof(transformsdata_t)); + + glm_mat4_identity(TRANSFORMS_DATA.projection); + glm_mat4_identity(TRANSFORMS_DATA.view); +} + +void transformsUpdate() { + TRANSFORMS_DATA.resolution[0] = WINDOW_WIDTH; + TRANSFORMS_DATA.resolution[1] = WINDOW_HEIGHT; + + glm_perspective( + glm_rad(45.0f), + TRANSFORMS_DATA.resolution[0] / TRANSFORMS_DATA.resolution[1], + 0.1f, + 100.0f, + TRANSFORMS_DATA.projection + ); + + glm_lookat( + (vec3){ 3, 3, 3 }, + (vec3){ 0, 0, 0 }, + (vec3){ 0, 1, 0 }, + TRANSFORMS_DATA.view + ); + + shaderBufferBind(&TRANSFORMS_BUFFER); + shaderBufferSetData(&TRANSFORMS_BUFFER, &TRANSFORMS_DATA); +} + +void transformsDispose() { + shaderBufferDispose(&TRANSFORMS_BUFFER); +} \ No newline at end of file diff --git a/src/duskgl/display/shader/fragments/transforms.glsl b/src/duskgl/display/shader/fragments/transforms.glsl index 8203653..86b59b7 100644 --- a/src/duskgl/display/shader/fragments/transforms.glsl +++ b/src/duskgl/display/shader/fragments/transforms.glsl @@ -16,11 +16,11 @@ layout(std140) uniform b_Transforms { }; vec2 transformDisplayGetSize() { - return vec2(DISPLAY_WIDTH, DISPLAY_HEIGHT); + return vec2(SCREEN_WIDTH, SCREEN_HEIGHT); } float transformDisplayGetAspectRatio() { - return (float(DISPLAY_WIDTH) / float(DISPLAY_HEIGHT)); + return (float(SCREEN_WIDTH) / float(SCREEN_HEIGHT)); } vec2 transformResolutionGetSize() { diff --git a/src/duskgl/display/shader/fragments/transforms.h b/src/duskgl/display/shader/fragments/transforms.h new file mode 100644 index 0000000..947b675 --- /dev/null +++ b/src/duskgl/display/shader/fragments/transforms.h @@ -0,0 +1,35 @@ +/** + * Copyright (c) 2025 Dominic Masters + * + * This software is released under the MIT License. + * https://opensource.org/licenses/MIT + */ + +#pragma once +#include "display/shader/shaderbuffer.h" + +#define TRANSFORMS_BLOCK_NAME "b_Transforms" + +typedef struct { + mat4 projection; + mat4 view; + vec2 resolution; +} transformsdata_t; + +extern shaderbuffer_t TRANSFORMS_BUFFER; +extern transformsdata_t TRANSFORMS_DATA; + +/** + * Initializes the transforms buffer and data. + */ +void transformsInit(); + +/** + * Updates the transforms buffer with the current data. + */ +void transformsUpdate(); + +/** + * Destroys the transforms buffer. + */ +void transformsDispose(); \ No newline at end of file diff --git a/src/duskgl/display/shader/shadermanager.c b/src/duskgl/display/shader/shadermanager.c index 7ca650e..ef20aec 100644 --- a/src/duskgl/display/shader/shadermanager.c +++ b/src/duskgl/display/shader/shadermanager.c @@ -6,11 +6,26 @@ */ #include "shadermanager.h" +#include "display/shader/fragments/transforms.h" +#include "display/shader/entityshader/entityshader.h" void shaderManagerInit() { + // Initialize the shader buffers + transformsInit(); + // Initialize the shaders + entityShaderInit(); +} + +void shaderManagerUpdate() { + // Update shader buffers + transformsUpdate(); } void shaderManagerDispose() { - + // Dispose the shaders + entityShaderDispose(); + + // Dispose the shader buffers + transformsDispose(); } \ No newline at end of file diff --git a/src/duskgl/display/shader/shadermanager.h b/src/duskgl/display/shader/shadermanager.h index 152f08b..5669cf5 100644 --- a/src/duskgl/display/shader/shadermanager.h +++ b/src/duskgl/display/shader/shadermanager.h @@ -6,17 +6,17 @@ */ #pragma once -#include "duskgl.h" - -// typedef struct { - -// } shadermanager_t; /** * Initializes the Shader Manager */ void shaderManagerInit(); +/** + * Updates the Shader Manager + */ +void shaderManagerUpdate(); + /** * Disposes of the Shader Manager */ diff --git a/src/duskgl/overworld/overworld.c b/src/duskgl/overworld/overworld.c index e0cdd1e..a3eac72 100644 --- a/src/duskgl/overworld/overworld.c +++ b/src/duskgl/overworld/overworld.c @@ -6,7 +6,10 @@ */ #include "overworld/overworld.h" +#include "display/quad.h" +#include "display/shader/entityshader/entityshader.h" void overworldRender() { - + entityShaderUse(); + quadRender(1); } \ No newline at end of file diff --git a/src/duskglfw/display/window.h b/src/duskglfw/display/window.h index 1c4ba96..be2722a 100644 --- a/src/duskglfw/display/window.h +++ b/src/duskglfw/display/window.h @@ -9,8 +9,8 @@ #include "duskglfw.h" #include "display/displaydefs.h" -#define WINDOW_WIDTH_DEFAULT SCREEN_WIDTH*4 -#define WINDOW_HEIGHT_DEFAULT SCREEN_HEIGHT*4 +#define WINDOW_WIDTH_DEFAULT SCREEN_WIDTH*3 +#define WINDOW_HEIGHT_DEFAULT SCREEN_HEIGHT*3 extern GLFWwindow* window; extern int32_t WINDOW_WIDTH;