Welcome to my Website.
I am a computer scientist, mathematician, and physicist
Computer Science
Graphics
Mathematics
Physics
Computer science has been and interest and passion of mine since I was little, and I have been a self-motivated learner of the subject ever since. While graphics has been the most consistent application of mine, I have never really specialized, but instead strived to develop a general set of problem solving skills I can bring to any situation.
Learning about control systems and the importance of software simulation.
We can use tensors in a practical way to elucidate some formulas often stated without context.
An incredibly important process in graphics systems is handling the order of the creation and destruction of objects.
I have been involved in graphics programming for almost a decade now, initially starting in Java with OpenGL and slowly moving into C++, which I've stayed for the last seven years or so. This passion for graphics has since strengthened and culminated into a passion for performat low-level computing systems. This project utilizes the Vulkan api, custom memory management, and a lightweight user API. I think there is a key balance that should be struck between a nice user-friendly API and highly performat graphics systems. Check out the devlogs!
In order to ensure maximum performance, the standard memory allocators are written in the framework. There is a layer of abstraction, shown in the image, where the allocation method can either be in RAM or on the GPU. This way, standard allocation techniques can easily be extended for use in graphics memory.
The framework is set up so that every frame can be processed concurrently. This is done by giving each frame ownership to its own command pool. This way, individual command buffer states are not tracked, and their concurrent recording can transpire.
The entire project is being created with the intention to maximize the processing power of the GPU. There will be as few bindings and as little allocations as can possibly happen. This way, performance is ensured.
#include <cpp2d/Graphics.h>
using namespace cpp2d;
int main()
{
{
DrawWindow window(1280, 720, "");
...
// Create the vertex array, specify the buffers
VertexArray vertexArray({ BufferType::Vertex });
vertexArray.setBufferData(0, vertices, sizeof(vertices));
...
// Push the attribute data
vertexArray[0].pushAttributes({
Buffers::Attribute {
.binding = 0,
.element_count = 2,
.location = 0,
.offset = offsetof(Vertex, pos)
}, ... });
// Create the pipeline with specified shaders and attribute data
GraphicsPipeline pipeline(
{ ShaderType::Vertex, ShaderType::Fragment },
window,
vertexArray.getAttributeFrame()
);
pipeline.getShader( ShaderType::Vertex ).fromFile( "vertex.glsl" );
pipeline.getShader(ShaderType::Fragment).fromFile("fragment.glsl");
pipeline.create();
// Run the main loop
while (window.isOpen())
{
window.pollEvents();
auto frameData = window.beginFrame();
pipeline.bind(frameData);
pipeline.setPushConstantData(frameData, constants);
vertexArray.draw(frameData);
window.endFrame(frameData);
}
}
// Destroy graphics instance
Graphics::GDI::get().destroy();
return 0;
}