From 3cd2fab63771eafae6262fd35e75b972ca702840 Mon Sep 17 00:00:00 2001 From: Riyyi Date: Wed, 7 Aug 2024 21:52:13 +0200 Subject: [PATCH] Render: Add support for int/double shader attributes --- assets/glsl/batch-3d.frag | 4 +-- assets/glsl/batch-3d.vert | 4 +-- assets/glsl/batch-cubemap.frag | 4 +-- assets/glsl/batch-cubemap.vert | 4 +-- assets/glsl/batch-font.frag | 4 +-- assets/glsl/batch-font.vert | 4 +-- assets/glsl/batch-quad.frag | 4 +-- assets/glsl/batch-quad.vert | 4 +-- src/inferno/render/buffer.cpp | 64 +++++++++++++++++++++++++++++---- src/inferno/render/renderer.cpp | 16 ++++----- src/inferno/render/renderer.h | 6 ++-- 11 files changed, 84 insertions(+), 34 deletions(-) diff --git a/assets/glsl/batch-3d.frag b/assets/glsl/batch-3d.frag index 5ff22ec..a957283 100644 --- a/assets/glsl/batch-3d.frag +++ b/assets/glsl/batch-3d.frag @@ -4,14 +4,14 @@ layout(location = 0) out vec4 color; in vec3 v_normal; in vec2 v_textureCoordinates; -in flat float v_textureIndex; +in flat uint v_textureIndex; uniform sampler2D u_textures[32]; void main() { vec4 textureColor = vec4(1.0f); - switch(int(v_textureIndex)) { + switch(v_textureIndex) { case 0: break; // Texture unit 0 is reserved for no texture case 1: textureColor *= texture(u_textures[1], v_textureCoordinates); break; case 2: textureColor *= texture(u_textures[2], v_textureCoordinates); break; diff --git a/assets/glsl/batch-3d.vert b/assets/glsl/batch-3d.vert index c09f022..ef14251 100644 --- a/assets/glsl/batch-3d.vert +++ b/assets/glsl/batch-3d.vert @@ -3,11 +3,11 @@ layout(location = 0) in vec3 a_position; layout(location = 1) in vec3 a_normal; layout(location = 2) in vec2 a_textureCoordinates; -layout(location = 3) in float a_textureIndex; +layout(location = 3) in uint a_textureIndex; out vec3 v_normal; out vec2 v_textureCoordinates; -out flat float v_textureIndex; +out flat uint v_textureIndex; uniform mat4 u_projectionView; diff --git a/assets/glsl/batch-cubemap.frag b/assets/glsl/batch-cubemap.frag index 157fdb9..11afb61 100644 --- a/assets/glsl/batch-cubemap.frag +++ b/assets/glsl/batch-cubemap.frag @@ -4,14 +4,14 @@ layout(location = 0) out vec4 color; in vec4 v_color; in vec3 v_textureCoordinates; -in flat float v_textureIndex; +in flat uint v_textureIndex; uniform samplerCube u_textures[32]; void main() { vec4 textureColor = v_color; - switch(int(v_textureIndex)) { + switch(v_textureIndex) { case 0: break; // Texture unit 0 is reserved for no texture case 1: textureColor *= texture(u_textures[1], v_textureCoordinates); break; case 2: textureColor *= texture(u_textures[2], v_textureCoordinates); break; diff --git a/assets/glsl/batch-cubemap.vert b/assets/glsl/batch-cubemap.vert index 81ba6ca..6bac061 100644 --- a/assets/glsl/batch-cubemap.vert +++ b/assets/glsl/batch-cubemap.vert @@ -2,11 +2,11 @@ layout(location = 0) in vec3 a_position; layout(location = 1) in vec4 a_color; -layout(location = 2) in float a_textureIndex; +layout(location = 2) in uint a_textureIndex; out vec4 v_color; out vec3 v_textureCoordinates; -out flat float v_textureIndex; +out flat uint v_textureIndex; uniform mat4 u_projectionView; diff --git a/assets/glsl/batch-font.frag b/assets/glsl/batch-font.frag index 6cbafca..1adfc15 100644 --- a/assets/glsl/batch-font.frag +++ b/assets/glsl/batch-font.frag @@ -4,7 +4,7 @@ layout(location = 0) out vec4 color; in vec4 v_color; in vec2 v_textureCoordinates; -in flat float v_textureIndex; +in flat uint v_textureIndex; in float v_width; in float v_edge; in float v_borderWidth; @@ -25,7 +25,7 @@ float alpha(float textureAlpha) void main() { vec4 textureColor = v_color; - switch(int(v_textureIndex)) { + switch(v_textureIndex) { case 0: break; // Texture unit 0 is reserved for no texture // case 1: textureColor.a = 1; break; case 1: textureColor.a = alpha(texture(u_textures[1], v_textureCoordinates).a); break; diff --git a/assets/glsl/batch-font.vert b/assets/glsl/batch-font.vert index 372be09..910060a 100644 --- a/assets/glsl/batch-font.vert +++ b/assets/glsl/batch-font.vert @@ -3,7 +3,7 @@ layout(location = 0) in vec3 a_position; layout(location = 1) in vec4 a_color; layout(location = 2) in vec2 a_textureCoordinates; -layout(location = 3) in float a_textureIndex; +layout(location = 3) in uint a_textureIndex; layout(location = 4) in float a_width; layout(location = 5) in float a_edge; layout(location = 6) in float a_borderWidth; @@ -13,7 +13,7 @@ layout(location = 9) in float a_offset; out vec4 v_color; out vec2 v_textureCoordinates; -out flat float v_textureIndex; +out flat uint v_textureIndex; out float v_width; out float v_edge; out float v_borderWidth; diff --git a/assets/glsl/batch-quad.frag b/assets/glsl/batch-quad.frag index 745e464..c8e7d6e 100644 --- a/assets/glsl/batch-quad.frag +++ b/assets/glsl/batch-quad.frag @@ -4,14 +4,14 @@ layout(location = 0) out vec4 color; in vec4 v_color; in vec2 v_textureCoordinates; -in flat float v_textureIndex; +in flat uint v_textureIndex; uniform sampler2D u_textures[32]; void main() { vec4 textureColor = v_color; - switch(int(v_textureIndex)) { + switch(v_textureIndex) { case 0: break; // Texture unit 0 is reserved for no texture case 1: textureColor *= texture(u_textures[1], v_textureCoordinates); break; case 2: textureColor *= texture(u_textures[2], v_textureCoordinates); break; diff --git a/assets/glsl/batch-quad.vert b/assets/glsl/batch-quad.vert index fa92a1e..0ce7896 100644 --- a/assets/glsl/batch-quad.vert +++ b/assets/glsl/batch-quad.vert @@ -3,11 +3,11 @@ layout(location = 0) in vec3 a_position; layout(location = 1) in vec4 a_color; layout(location = 2) in vec2 a_textureCoordinates; -layout(location = 3) in float a_textureIndex; +layout(location = 3) in uint a_textureIndex; out vec4 v_color; out vec2 v_textureCoordinates; -out flat float v_textureIndex; +out flat uint v_textureIndex; uniform mat4 u_projectionView; diff --git a/src/inferno/render/buffer.cpp b/src/inferno/render/buffer.cpp index 59a6ab5..bb99abe 100644 --- a/src/inferno/render/buffer.cpp +++ b/src/inferno/render/buffer.cpp @@ -306,13 +306,63 @@ void VertexArray::addVertexBuffer(std::shared_ptr vertexBuffer) uint32_t index = 0; for (const auto& element : layout) { glEnableVertexAttribArray(index); - glVertexAttribPointer( - index, - element.getTypeCount(), - element.getTypeGL(), - element.getNormalized() ? GL_TRUE : GL_FALSE, - layout.getStride(), - reinterpret_cast(element.getOffset())); + switch (element.getType()) { + case BufferElementType::None: + break; + case BufferElementType::Int: + case BufferElementType::Int2: + case BufferElementType::Int3: + case BufferElementType::Int4: + case BufferElementType::Uint: + case BufferElementType::Uint2: + case BufferElementType::Uint3: + case BufferElementType::Uint4: { + glVertexAttribIPointer( + index, + element.getTypeCount(), + element.getTypeGL(), + layout.getStride(), + reinterpret_cast(element.getOffset())); + break; + } + case BufferElementType::Bool: + case BufferElementType::Bool2: + case BufferElementType::Bool3: + case BufferElementType::Bool4: + case BufferElementType::Float: + case BufferElementType::Vec2: + case BufferElementType::Vec3: + case BufferElementType::Vec4: + case BufferElementType::Mat2: + case BufferElementType::Mat3: + case BufferElementType::Mat4: { + glVertexAttribPointer( + index, + element.getTypeCount(), + element.getTypeGL(), + element.getNormalized() ? GL_TRUE : GL_FALSE, + layout.getStride(), + reinterpret_cast(element.getOffset())); + break; + } + case BufferElementType::VecDouble: + case BufferElementType::VecDouble2: + case BufferElementType::VecDouble3: + case BufferElementType::VecDouble4: + case BufferElementType::MatDouble2: + case BufferElementType::MatDouble3: + case BufferElementType::MatDouble4: { + glVertexAttribLPointer( + index, + element.getTypeCount(), + element.getTypeGL(), + layout.getStride(), + reinterpret_cast(element.getOffset())); + break; + } + default: + VERIFY_NOT_REACHED(); + }; index++; } diff --git a/src/inferno/render/renderer.cpp b/src/inferno/render/renderer.cpp index a33690e..3fecf26 100644 --- a/src/inferno/render/renderer.cpp +++ b/src/inferno/render/renderer.cpp @@ -221,7 +221,7 @@ Renderer2D::Renderer2D(s) { BufferElementType::Vec3, "a_position" }, { BufferElementType::Vec4, "a_color" }, { BufferElementType::Vec2, "a_textureCoordinates" }, - { BufferElementType::Float, "a_textureIndex" }, + { BufferElementType::Uint, "a_textureIndex" }, }); m_vertexArray->addVertexBuffer(vertexBuffer); @@ -271,7 +271,7 @@ void Renderer2D::drawQuad(const TransformComponent& transform, glm::mat4 color, m_vertexBufferPtr->position = transform.transform * m_vertexPositions[i]; m_vertexBufferPtr->color = color[i]; m_vertexBufferPtr->textureCoordinates = textureCoordinates[i]; - m_vertexBufferPtr->textureIndex = static_cast(textureUnitIndex); + m_vertexBufferPtr->textureIndex = textureUnitIndex; m_vertexBufferPtr++; } @@ -345,7 +345,7 @@ RendererCubemap::RendererCubemap(s) vertexBuffer->setLayout({ { BufferElementType::Vec3, "a_position" }, { BufferElementType::Vec4, "a_color" }, - { BufferElementType::Float, "a_textureIndex" }, + { BufferElementType::Uint, "a_textureIndex" }, }); m_vertexArray->addVertexBuffer(vertexBuffer); @@ -386,7 +386,7 @@ void RendererCubemap::drawCubemap(const TransformComponent& transform, glm::mat4 for (uint32_t i = 0; i < vertexPerQuad * quadPerCube; i++) { m_vertexBufferPtr->position = transform.transform * m_vertexPositions[i]; m_vertexBufferPtr->color = color[i % 4]; - m_vertexBufferPtr->textureIndex = static_cast(textureUnitIndex); + m_vertexBufferPtr->textureIndex = textureUnitIndex; m_vertexBufferPtr++; } @@ -423,7 +423,7 @@ RendererFont::RendererFont(s) { BufferElementType::Vec3, "a_position" }, { BufferElementType::Vec4, "a_color" }, { BufferElementType::Vec2, "a_textureCoordinates" }, - { BufferElementType::Float, "a_textureIndex" }, + { BufferElementType::Uint, "a_textureIndex" }, { BufferElementType::Float, "a_width" }, { BufferElementType::Float, "a_edge" }, { BufferElementType::Float, "a_borderWidth" }, @@ -450,7 +450,7 @@ void RendererFont::drawSymbol(std::array& symbolQua m_vertexBufferPtr->quad.position = symbolQuad[i].quad.position; m_vertexBufferPtr->quad.color = symbolQuad[i].quad.color; m_vertexBufferPtr->quad.textureCoordinates = symbolQuad[i].quad.textureCoordinates; - m_vertexBufferPtr->quad.textureIndex = static_cast(textureUnitIndex); + m_vertexBufferPtr->quad.textureIndex = textureUnitIndex; m_vertexBufferPtr->width = symbolQuad[i].width; m_vertexBufferPtr->edge = symbolQuad[i].edge; @@ -495,7 +495,7 @@ Renderer3D::Renderer3D(s) { BufferElementType::Vec3, "a_position" }, { BufferElementType::Vec3, "a_normal" }, { BufferElementType::Vec2, "a_textureCoordinates" }, - { BufferElementType::Float, "a_textureIndex" }, + { BufferElementType::Uint, "a_textureIndex" }, }); m_vertexArray->addVertexBuffer(vertexBuffer); @@ -521,7 +521,7 @@ void Renderer3D::drawModel(std::span vertices, std::spanposition = transform.transform * glm::vec4(vertex.position, 1.0f); m_vertexBufferPtr->normal = vertex.normal; m_vertexBufferPtr->textureCoordinates = vertex.textureCoordinates; - m_vertexBufferPtr->textureIndex = static_cast(textureUnitIndex); + m_vertexBufferPtr->textureIndex = textureUnitIndex; m_vertexBufferPtr++; } diff --git a/src/inferno/render/renderer.h b/src/inferno/render/renderer.h index 1d4502a..e680115 100644 --- a/src/inferno/render/renderer.h +++ b/src/inferno/render/renderer.h @@ -27,13 +27,13 @@ struct QuadVertex { glm::vec3 position { 0.0f, 0.0f, 0.0f }; glm::vec4 color { 1.0f, 1.0f, 1.0f, 1.0f }; glm::vec2 textureCoordinates { 0.0f, 0.0f }; - float textureIndex = 0; + uint32_t textureIndex = 0; }; struct CubemapVertex { glm::vec3 position { 0.0f, 0.0f, 0.0f }; glm::vec4 color { 1.0f, 1.0f, 1.0f, 1.0f }; - float textureIndex = 0; + uint32_t textureIndex = 0; }; struct SymbolVertex { @@ -54,7 +54,7 @@ struct Vertex { glm::vec3 position { 0.0f, 0.0f, 0.0f }; glm::vec3 normal { 1.0f, 1.0f, 1.0f }; glm::vec2 textureCoordinates { 0.0f, 0.0f }; - float textureIndex = 0; + uint32_t textureIndex = 0; }; // -------------------------------------