Batch Renderer 2/2

This commit is contained in:
Isuru Samarathunga
2025-11-02 04:14:47 +05:30
parent 0bffbbf66c
commit 9fafab5145
6 changed files with 49 additions and 21 deletions

View File

@ -10,7 +10,7 @@ layout(set = 2, binding = 0) uniform sampler2D texSampler;
void main() void main()
{ {
outColor = inVertexColor; outColor = texture(texSampler, inTexCoord);
if(outColor.w < 0.1) if(outColor.w < 0.1)
discard; discard;
} }

View File

@ -29,6 +29,6 @@ void main()
{ {
SpriteInstanceData spriteData = sboSpriteData.data[gl_InstanceIndex]; SpriteInstanceData spriteData = sboSpriteData.data[gl_InstanceIndex];
gl_Position = uboPerScene.projection * uboPerFrame.view * spriteData.Transform * vec4(inPosition, 0.0f, 1.0f); gl_Position = uboPerScene.projection * uboPerFrame.view * spriteData.Transform * vec4(inPosition, 0.0f, 1.0f);
outTexCoord = inTexCoord; outTexCoord = vec2(spriteData.TexCoords) + vec2(spriteData.TexCoords.z, spriteData.TexCoords.w) * inTexCoord;
outVertexColor = spriteData.Color; outVertexColor = spriteData.Color;
} }

File diff suppressed because one or more lines are too long

View File

@ -18,6 +18,8 @@
#include <IAEngine/LibInterface.hpp> #include <IAEngine/LibInterface.hpp>
#include <Renderer.hpp> #include <Renderer.hpp>
#define STB_IMAGE_IMPLEMENTATION
#include <Vendor/stb/stb_image.h>
namespace ia::iae namespace ia::iae
{ {
@ -96,9 +98,25 @@ namespace ia::iae
namespace ia::iae namespace ia::iae
{ {
Handle CreateTexture(IN PCCHAR path, IN INT32 tileWidth = -1, IN INT32 tileHeight = -1)
{
INT32 w, h, n;
auto pixels = stbi_load(path, &w, &h, &n, STBI_rgb_alpha);
const auto t = Renderer::CreateTexture(pixels, w, h, tileWidth == -1 ? 1 : w/tileWidth, tileHeight == -1 ? 1 : h/tileHeight);
stbi_image_free(pixels);
return t;
}
Handle textures[5];
VOID IAEngine::Initialize() VOID IAEngine::Initialize()
{ {
Renderer::Initialize(IVec2{g_designViewport.x, g_designViewport.y}); Renderer::Initialize(IVec2{g_designViewport.x, g_designViewport.y});
textures[0] = CreateTexture("Resources/Cute_Fantasy_Free/Tiles/Beach_Tile.png", 16, 16);
textures[1] = CreateTexture("Resources/Cute_Fantasy_Free/Tiles/Cliff_Tile.png", 16, 16);
Renderer::SetTextureAtlas({textures[0], textures[1]});
} }
VOID IAEngine::Terminate() VOID IAEngine::Terminate()
@ -108,6 +126,10 @@ namespace ia::iae
VOID IAEngine::Update() VOID IAEngine::Update()
{ {
Renderer::DrawStaticSpriteTopLeft(textures[1], 0, {0.0f, 0.0f}, {1.0f, 1.0f}, 0.0f);
Renderer::DrawStaticSpriteTopLeft(textures[1], 1, {16.0f, 0.0f}, {1.0f, 1.0f}, 0.0f);
Renderer::DrawStaticSpriteTopLeft(textures[1], 2, {32.0f, 0.0f}, {1.0f, 1.0f}, 0.0f);
Renderer::Update(); Renderer::Update();
} }

View File

@ -74,9 +74,10 @@ namespace ia::iae
SDL_GPUTransferBuffer *g_spriteDataStagingBuffer{}; SDL_GPUTransferBuffer *g_spriteDataStagingBuffer{};
SDL_GPUTexture *g_defaultTexture{}; SDL_GPUTexture *g_defaultTexture{};
SDL_GPUTexture *g_activeTextureAtlas{};
Map<Handle, Vec4> g_activeTextureAtlasUVMap; Vec2 g_activeTextureAtlasInverseSize{};
SDL_GPUTexture *g_activeTextureAtlas{};
Map<Handle, Vec2> g_activeTextureAtlasUVMap;
EXTERN BOOL g_isDebugMode; EXTERN BOOL g_isDebugMode;
EXTERN Vec2 g_designViewport; EXTERN Vec2 g_designViewport;
@ -104,8 +105,9 @@ namespace ia::iae
delete g_debugPipeline; delete g_debugPipeline;
delete g_geometryPipeline; delete g_geometryPipeline;
if (g_defaultTexture) for (SIZE_T i = 0; i < g_texureData.size(); i++)
DestroyTexture(g_defaultTexture); DestroyTexture(i);
if (g_activeTextureAtlas && (g_activeTextureAtlas != g_defaultTexture)) if (g_activeTextureAtlas && (g_activeTextureAtlas != g_defaultTexture))
DestroyTexture(g_activeTextureAtlas); DestroyTexture(g_activeTextureAtlas);
@ -125,8 +127,6 @@ namespace ia::iae
VOID Renderer::Update() VOID Renderer::Update()
{ {
DrawStaticSpriteTopLeft(0, 0, {10.0f, 0.0f}, {100.0f, 100.0f}, 0.0f);
DrawStaticSpriteTopLeft(0, 0, {200.0f, 300.0f}, {100.0f, 100.0f}, 0.0f);
Render(); Render();
} }
@ -209,7 +209,7 @@ namespace ia::iae
{ {
Mat4 transform = glm::translate(glm::mat4(1.0f), glm::vec3{position.x, position.y, 0}); Mat4 transform = glm::translate(glm::mat4(1.0f), glm::vec3{position.x, position.y, 0});
transform = glm::rotate(transform, rotation, glm::vec3(0.0f, 0.0f, 1.0f)); transform = glm::rotate(transform, rotation, glm::vec3(0.0f, 0.0f, 1.0f));
transform = glm::scale(transform, glm::vec3{scale.x, scale.y, 1.0f}); transform = glm::scale(transform, glm::vec3{scale.x * g_texureData[texture].TileWidth, scale.y * g_texureData[texture].TileHeight, 1.0f});
g_staticSprites.pushBack({.Transform = transform, g_staticSprites.pushBack({.Transform = transform,
.TexCoords = GetTextureAtlasCoordinates(texture, tileIndex), .TexCoords = GetTextureAtlasCoordinates(texture, tileIndex),
.Color = {1.0f, 1.0f, 1.0f, 1.0f}}); .Color = {1.0f, 1.0f, 1.0f, 1.0f}});
@ -220,7 +220,7 @@ namespace ia::iae
{ {
Mat4 transform = glm::translate(glm::mat4(1.0f), glm::vec3{position.x, position.y, 0}); Mat4 transform = glm::translate(glm::mat4(1.0f), glm::vec3{position.x, position.y, 0});
transform = glm::rotate(transform, rotation, glm::vec3(0.0f, 0.0f, 1.0f)); transform = glm::rotate(transform, rotation, glm::vec3(0.0f, 0.0f, 1.0f));
transform = glm::scale(transform, glm::vec3{scale.x, scale.y, 1.0f}); transform = glm::scale(transform, glm::vec3{scale.x * g_texureData[texture].TileWidth, scale.y * g_texureData[texture].TileHeight, 1.0f});
g_dynamicSprites.pushBack({.Transform = transform, g_dynamicSprites.pushBack({.Transform = transform,
.TexCoords = GetTextureAtlasCoordinates(texture, tileIndex), .TexCoords = GetTextureAtlasCoordinates(texture, tileIndex),
.Color = {1.0f, 1.0f, 1.0f, 1.0f}}); .Color = {1.0f, 1.0f, 1.0f, 1.0f}});
@ -286,10 +286,11 @@ namespace ia::iae
VOID Renderer::SetTextureAtlas(IN CONST Vector<Handle> textures) VOID Renderer::SetTextureAtlas(IN CONST Vector<Handle> textures)
{ {
g_activeTextureAtlasUVMap = Map<Handle, Vec4>(); if (g_activeTextureAtlas && (g_activeTextureAtlas != g_defaultTexture))
if (g_activeTextureAtlas)
DestroyTexture(g_activeTextureAtlas); DestroyTexture(g_activeTextureAtlas);
g_activeTextureAtlasUVMap = Map<Handle, Vec2>();
INT32 atlasWidth{0}, atlasHeight{0}; INT32 atlasWidth{0}, atlasHeight{0};
for (const auto &t : textures) for (const auto &t : textures)
{ {
@ -299,6 +300,8 @@ namespace ia::iae
atlasHeight = d.Height; atlasHeight = d.Height;
} }
g_activeTextureAtlasInverseSize = {1.0f / ((FLOAT32) atlasWidth), 1.0f / ((FLOAT32) atlasHeight)};
const auto pixels = new UINT8[atlasWidth * atlasHeight * 4]; const auto pixels = new UINT8[atlasWidth * atlasHeight * 4];
INT32 atlasCursor{0}; INT32 atlasCursor{0};
@ -306,10 +309,8 @@ namespace ia::iae
{ {
const auto &d = g_texureData[t]; const auto &d = g_texureData[t];
for (INT32 y = 0; y < d.Height; y++) for (INT32 y = 0; y < d.Height; y++)
ia_memcpy(&pixels[atlasCursor + (y * atlasWidth)], d.Pixels, d.Width * 4); ia_memcpy(&pixels[(atlasCursor + (y * atlasWidth)) * 4], &d.Pixels[y * d.Width * 4], d.Width * 4);
g_activeTextureAtlasUVMap[t] = g_activeTextureAtlasUVMap[t] = Vec2(((FLOAT32) atlasCursor) / ((FLOAT32) atlasWidth), 0.0f);
Vec4(((FLOAT32) atlasCursor) / ((FLOAT32) atlasWidth), 0.0f,
((FLOAT32) d.Width) / ((FLOAT32) atlasWidth), ((FLOAT32) d.Height) / ((FLOAT32) atlasHeight));
atlasCursor += d.Width; atlasCursor += d.Width;
} }
@ -323,7 +324,12 @@ namespace ia::iae
{ {
const auto &d = g_texureData[texture]; const auto &d = g_texureData[texture];
const auto &t = g_activeTextureAtlasUVMap[texture]; const auto &t = g_activeTextureAtlasUVMap[texture];
return t; const auto pX =
((INT32) (tileIndex % d.TileCountX) * ((FLOAT32) d.TileWidth)) * g_activeTextureAtlasInverseSize.x;
const auto pY =
((INT32) (tileIndex / d.TileCountX) * ((FLOAT32) d.TileHeight)) * g_activeTextureAtlasInverseSize.y;
return Vec4(t.x + pX, t.y + pY, d.TileWidth * g_activeTextureAtlasInverseSize.x,
d.TileHeight * g_activeTextureAtlasInverseSize.y);
} }
} // namespace ia::iae } // namespace ia::iae

View File

@ -679,9 +679,9 @@ typedef unsigned char validate_uint32[sizeof(stbi__uint32)==4 ? 1 : -1];
#endif #endif
#ifndef STBI_MALLOC #ifndef STBI_MALLOC
#define STBI_MALLOC(sz) malloc(sz) #define STBI_MALLOC(sz) ia_malloc(sz)
#define STBI_REALLOC(p,newsz) realloc(p,newsz) #define STBI_REALLOC(p,newsz) realloc(p,newsz)
#define STBI_FREE(p) free(p) #define STBI_FREE(p) ia_free(p)
#endif #endif
#ifndef STBI_REALLOC_SIZED #ifndef STBI_REALLOC_SIZED