Skip to content

Commit

Permalink
grass shader
Browse files Browse the repository at this point in the history
  • Loading branch information
beaumanvienna committed Jun 19, 2024
1 parent 7be73a4 commit 2250b17
Show file tree
Hide file tree
Showing 8 changed files with 54 additions and 30 deletions.
40 changes: 31 additions & 9 deletions engine/platform/Vulkan/VKbuffer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -59,18 +59,40 @@ namespace GfxRenderEngine

VK_Buffer::VK_Buffer(uint size, Buffer::BufferUsage bufferUsage) : m_Device(VK_Core::m_Device.get())
{
if (bufferUsage == Buffer::BufferUsage::SMALL_SHADER_DATA_BUFFER_VISIBLE_TO_CPU)
switch (bufferUsage)
{
m_InstanceSize = size;
m_InstanceCount = 1;
m_UsageFlags = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
m_MemoryPropertyFlags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
case Buffer::BufferUsage::UNIFORM_BUFFER_VISIBLE_TO_CPU:
{
m_InstanceSize = size;
m_InstanceCount = 1;
m_UsageFlags = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
m_MemoryPropertyFlags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;

VkDeviceSize minOffsetAlignment = m_Device->m_Properties.limits.minUniformBufferOffsetAlignment;
VkDeviceSize minOffsetAlignment = m_Device->m_Properties.limits.minUniformBufferOffsetAlignment;

m_AlignmentSize = GetAlignment(m_InstanceSize, minOffsetAlignment);
m_BufferSize = m_AlignmentSize * m_InstanceCount;
m_Device->CreateBuffer(m_BufferSize, m_UsageFlags, m_MemoryPropertyFlags, m_Buffer, m_Memory);
m_AlignmentSize = GetAlignment(m_InstanceSize, minOffsetAlignment);
m_BufferSize = m_AlignmentSize * m_InstanceCount;
m_Device->CreateBuffer(m_BufferSize, m_UsageFlags, m_MemoryPropertyFlags, m_Buffer, m_Memory);
break;
}
case Buffer::BufferUsage::STORAGE_BUFFER_VISIBLE_TO_CPU:
{
m_InstanceSize = size;
m_InstanceCount = 1;
m_UsageFlags = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
m_MemoryPropertyFlags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;

VkDeviceSize minOffsetAlignment = m_Device->m_Properties.limits.minUniformBufferOffsetAlignment;

m_AlignmentSize = GetAlignment(m_InstanceSize, minOffsetAlignment);
m_BufferSize = m_AlignmentSize * m_InstanceCount;
m_Device->CreateBuffer(m_BufferSize, m_UsageFlags, m_MemoryPropertyFlags, m_Buffer, m_Memory);
break;
}
default:
{
LOG_CORE_CRITICAL("unrecognized buffer usage");
}
}
}

Expand Down
2 changes: 1 addition & 1 deletion engine/platform/Vulkan/VKbuffer.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ namespace GfxRenderEngine
VK_Buffer(VkDeviceSize instanceSize, uint instanceCount, VkBufferUsageFlags usageFlags,
VkMemoryPropertyFlags memoryPropertyFlags, VkDeviceSize minOffsetAlignment = 1);

VK_Buffer(uint size, Buffer::BufferUsage bufferUsage = Buffer::BufferUsage::SMALL_SHADER_DATA_BUFFER_VISIBLE_TO_CPU);
VK_Buffer(uint size, Buffer::BufferUsage bufferUsage = Buffer::BufferUsage::UNIFORM_BUFFER_VISIBLE_TO_CPU);

virtual ~VK_Buffer();

Expand Down
2 changes: 1 addition & 1 deletion engine/platform/Vulkan/VKrenderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ namespace GfxRenderEngine
VK_DescriptorSetLayout::Builder()
.AddBinding(0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_SHADER_STAGE_VERTEX_BIT) // shader data for instances
.AddBinding(1, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_SHADER_STAGE_VERTEX_BIT) // dummy
.AddBinding(2, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_SHADER_STAGE_VERTEX_BIT) // shader data for height map
.AddBinding(2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, VK_SHADER_STAGE_VERTEX_BIT) // shader data for height map
.Build();

std::unique_ptr<VK_DescriptorSetLayout> instanceDescriptorSetLayout =
Expand Down
2 changes: 1 addition & 1 deletion engine/platform/Vulkan/VKresourceDescriptor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ namespace GfxRenderEngine
}
if (hBuffer)
{
builder.AddBinding(2, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_SHADER_STAGE_VERTEX_BIT);
builder.AddBinding(2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, VK_SHADER_STAGE_VERTEX_BIT);
}
std::unique_ptr<VK_DescriptorSetLayout> localDescriptorSetLayout = builder.Build();

Expand Down
19 changes: 9 additions & 10 deletions engine/platform/Vulkan/shaders/grass.vert
Original file line number Diff line number Diff line change
Expand Up @@ -69,9 +69,9 @@ layout(set = 2, binding = 0) uniform InstanceUniformBuffer
#define WIDTH 1024 // row
#define HEIGHT 750 // col
#define NUM_HEIGHT_VALUES WIDTH*HEIGHT // 768000
#define INSTANCE_COUNT 16384 // max buffer size 65536 bytes
#define INSTANCE_COUNT NUM_HEIGHT_VALUES

layout(set = 2, binding = 2) uniform HeightMap
layout(set = 2, binding = 2) readonly buffer HeightMap
{
int m_HeightMapData[INSTANCE_COUNT];
} heightMap;
Expand All @@ -86,19 +86,18 @@ void main()
{
mat4 baseModelMatrix = baseTransform.m_InstanceData.m_ModelMatrix;
mat4 normalMatrix = baseTransform.m_InstanceData.m_NormalMatrix;


int index = int(floor(46.875 * gl_InstanceIndex));

int index = gl_InstanceIndex;
int hgt = heightMap.m_HeightMapData[index];
float row = floor(index / WIDTH);
float col = floor((index - WIDTH * row));

mat4 localTranslation = mat4
(
vec4(1.0, 0.0, 0.0, 0.0), // first column
vec4(0.0, 1.0, 0.0, 0.0), // second column
vec4(0.0, 0.0, 1.0, 0.0), // third column
vec4(col, hgt, row, 1.0) // fourth column
vec4(4.0, 0.0, 0.0, 0.0), // first column
vec4(0.0, 4.0, 0.0, 0.0), // second column
vec4(0.0, 0.0, 4.0, 0.0), // third column
vec4(col, row, -hgt, 1.0) // fourth column
);

// projection * view * model * position
Expand Down
4 changes: 2 additions & 2 deletions engine/renderer/buffer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,14 +29,14 @@
namespace GfxRenderEngine
{

std::shared_ptr<Buffer> Buffer::Create(uint size)
std::shared_ptr<Buffer> Buffer::Create(uint size, BufferUsage bufferUsage)
{
std::shared_ptr<Buffer> buffer;

switch (RendererAPI::GetAPI())
{
case RendererAPI::VULKAN:
buffer = std::make_shared<VK_Buffer>(size);
buffer = std::make_shared<VK_Buffer>(size, bufferUsage);
break;
default:
buffer = nullptr;
Expand Down
6 changes: 4 additions & 2 deletions engine/renderer/buffer.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,14 +35,16 @@ namespace GfxRenderEngine
public:
enum class BufferUsage
{
SMALL_SHADER_DATA_BUFFER_VISIBLE_TO_CPU
UNIFORM_BUFFER_VISIBLE_TO_CPU,
STORAGE_BUFFER_VISIBLE_TO_CPU
};

public:
virtual ~Buffer() = default;
virtual void MapBuffer() = 0;
virtual void WriteToBuffer(const void* data) = 0;
virtual bool Flush() = 0;
static std::shared_ptr<Buffer> Create(uint size /*in bytes*/);
static std::shared_ptr<Buffer> Create(uint size /*in bytes*/,
BufferUsage bufferUsage = BufferUsage::UNIFORM_BUFFER_VISIBLE_TO_CPU);
};
} // namespace GfxRenderEngine
9 changes: 5 additions & 4 deletions engine/renderer/builder/terrainBuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -289,7 +289,7 @@ namespace GfxRenderEngine
if (fileExists)
{
Image& heightMap = *terrainComponent.m_HeightMap.get();
uint heightMapSize = std::min(16384, heightMap.Size());
uint heightMapSize = heightMap.Size();
Resources::ResourceBuffers resourceBuffers;
{
// unforunately, need to copy one buffer into another (glsl does not support uint8_t by default)
Expand All @@ -300,7 +300,7 @@ namespace GfxRenderEngine
}
int bufferSize = heightMapSize * sizeof(int); // in bytes
auto& ubo = resourceBuffers[Resources::HEIGHTMAP];
ubo = Buffer::Create(bufferSize);
ubo = Buffer::Create(bufferSize, Buffer::BufferUsage::STORAGE_BUFFER_VISIBLE_TO_CPU);
resourceBuffers[Resources::HEIGHTMAP]->MapBuffer();
// update ubo
ubo->WriteToBuffer(bufferData.data());
Expand All @@ -319,8 +319,9 @@ namespace GfxRenderEngine
registry.emplace<GrassTag>(grassNode.GetGameObject(), grassTag);

auto& transform = registry.get<TransformComponent>(grassEntityRoot);
transform.SetTranslation({-11.0f, 8.4f, -1.4f});
transform.SetScale({0.235f, 0.235f, 0.235f});
transform.SetRotation({3.14159f, 0.767164f, 3.14159f});
transform.SetTranslation({4.37885f, -1.14346f, 59.3405f});
transform.SetScale({0.0649992f, 0.0376f, 0.0649992f});
}
}
}
Expand Down

0 comments on commit 2250b17

Please sign in to comment.