added color to attribute buffer

This commit is contained in:
2025-01-22 11:15:15 -07:00
parent 42d792e9f4
commit ae2997d260
4 changed files with 30 additions and 27 deletions

View File

@ -40,10 +40,10 @@ SpriteRenderer::SpriteRenderer() {
//Initialize Resources //Initialize Resources
float vertexData[] = { float vertexData[] = {
0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f,
1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f,
1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f,
0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f 0.0f, 1.0f, 0.0f
}; };
unsigned int indices[]{ unsigned int indices[]{
@ -56,19 +56,20 @@ SpriteRenderer::SpriteRenderer() {
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData), vertexData, GL_STATIC_DRAW); glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData), vertexData, GL_STATIC_DRAW);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 7 * sizeof(float), (void*)0); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 7 * sizeof(float), (void*)(3 * sizeof(float)));
glBindBuffer(GL_ARRAY_BUFFER, instanceVBO); glBindBuffer(GL_ARRAY_BUFFER, instanceVBO);
glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, 16 * sizeof(float), (void*)0); glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 20 * sizeof(float), (void*)(16 * sizeof(float)));
glVertexAttribPointer(3, 4, GL_FLOAT, GL_FALSE, 16 * sizeof(float), (void*)(sizeof(float) * 4)); glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, 20 * sizeof(float), (void*)0);
glVertexAttribPointer(4, 4, GL_FLOAT, GL_FALSE, 16 * sizeof(float), (void*)(sizeof(float) * 8)); glVertexAttribPointer(3, 4, GL_FLOAT, GL_FALSE, 20 * sizeof(float), (void*)(sizeof(float) * 4));
glVertexAttribPointer(5, 4, GL_FLOAT, GL_FALSE, 16 * sizeof(float), (void*)(sizeof(float) * 12)); glVertexAttribPointer(4, 4, GL_FLOAT, GL_FALSE, 20 * sizeof(float), (void*)(sizeof(float) * 8));
glVertexAttribPointer(5, 4, GL_FLOAT, GL_FALSE, 20 * sizeof(float), (void*)(sizeof(float) * 12));
glEnableVertexAttribArray(0); glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1); glEnableVertexAttribArray(1);
glEnableVertexAttribArray(2); glEnableVertexAttribArray(2);
glEnableVertexAttribArray(3); glEnableVertexAttribArray(3);
glEnableVertexAttribArray(4); glEnableVertexAttribArray(4);
glEnableVertexAttribArray(5); glEnableVertexAttribArray(5);
glVertexAttribDivisor(1, 1);
glVertexAttribDivisor(2, 1); glVertexAttribDivisor(2, 1);
glVertexAttribDivisor(3, 1); glVertexAttribDivisor(3, 1);
glVertexAttribDivisor(4, 1); glVertexAttribDivisor(4, 1);
@ -131,13 +132,13 @@ SpriteRenderer::~SpriteRenderer() {
glDeleteProgram(shaderProgram); glDeleteProgram(shaderProgram);
} }
void SpriteRenderer::drawSprite(glm::mat4 transform) { void SpriteRenderer::drawSprite(glm::mat4 transform, glm::vec4 color) {
matrices.push_back(transform); matrices.push_back(instance{transform, color});
} }
void SpriteRenderer::flush() { void SpriteRenderer::flush() {
glBindBuffer(GL_ARRAY_BUFFER, instanceVBO); glBindBuffer(GL_ARRAY_BUFFER, instanceVBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(glm::mat4) * matrices.size(), matrices.data(), GL_STREAM_DRAW); glBufferData(GL_ARRAY_BUFFER, sizeof(instance) * matrices.size(), matrices.data(), GL_STREAM_DRAW);
glBindVertexArray(VAO); glBindVertexArray(VAO);
glUseProgram(shaderProgram); glUseProgram(shaderProgram);
glDrawElementsInstanced(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0, matrices.size()); glDrawElementsInstanced(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0, matrices.size());

View File

@ -2,15 +2,20 @@
#include <vector> #include <vector>
#include <glm/glm.hpp> #include <glm/glm.hpp>
struct instance {
glm::mat4 model;
glm::vec4 color;
};
class SpriteRenderer { class SpriteRenderer {
private: private:
unsigned int VAO, VBO, EBO, instanceVBO, shaderProgram; unsigned int VAO, VBO, EBO, instanceVBO, shaderProgram;
std::vector<glm::mat4> matrices; std::vector<instance> matrices;
public: public:
SpriteRenderer(); SpriteRenderer();
~SpriteRenderer(); ~SpriteRenderer();
void drawSprite(glm::mat4 transform); void drawSprite(glm::mat4 transform, glm::vec4 color);
void flush(); void flush();
}; };

View File

@ -22,5 +22,5 @@ void Square::Draw(SpriteRenderer* renderer) {
//glBindVertexArray(VAO); //glBindVertexArray(VAO);
//glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); //glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
//glBindVertexArray(NULL); //glBindVertexArray(NULL);
renderer->drawSprite(model_transform); renderer->drawSprite(model_transform, color);
} }

View File

@ -91,8 +91,6 @@ void renderInit() {
glBufferData(GL_UNIFORM_BUFFER, sizeof(glm::mat4)*2, new matricies{glm::ortho(0.0f, 800.0f, 600.0f, 0.0f), glm::translate(glm::mat4(1.0f), glm::vec3(0, 0, 0))}, GL_STATIC_DRAW); glBufferData(GL_UNIFORM_BUFFER, sizeof(glm::mat4)*2, new matricies{glm::ortho(0.0f, 800.0f, 600.0f, 0.0f), glm::translate(glm::mat4(1.0f), glm::vec3(0, 0, 0))}, GL_STATIC_DRAW);
glBindBuffer(GL_UNIFORM_BUFFER, 0); glBindBuffer(GL_UNIFORM_BUFFER, 0);
glBindBufferBase(GL_UNIFORM_BUFFER, PROJ_MAT_UNIFORM_BUFFER, uniformBuffer); glBindBufferBase(GL_UNIFORM_BUFFER, PROJ_MAT_UNIFORM_BUFFER, uniformBuffer);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
} }
void deinit() { void deinit() {
@ -103,18 +101,17 @@ void render() {
INFO("Render thread starting"); INFO("Render thread starting");
renderInit(); renderInit();
SpriteRenderer* renderer = new SpriteRenderer(); SpriteRenderer* renderer = new SpriteRenderer();
std::vector<Square*> squares; Square square1(glm::vec3(100, 100, 0), glm::vec3(100, 100, 1), glm::vec4(1.0f, 0.0f, 0.0f, 1.0f));
for (int i = 0; i < 100 * 100; i++) { Square square2(glm::vec3(600, 100, 0), glm::vec3(100, 100, 1), glm::vec4(0.0f, 1.0f, 0.0f, 1.0f));
int x = i % 100; Square square3(glm::vec3(100, 400, 0), glm::vec3(100, 100, 1), glm::vec4(0.0f, 0.0f, 1.0f, 1.0f));
int y = i / 100; Square square4(glm::vec3(600, 400, 0), glm::vec3(100, 100, 1), glm::vec4(0.7f, 0.7f, 0.3f, 1.0f));
squares.push_back(new Square({x*6, y*6, 0}, {6, 6, 1}, {0, 0, 1, 1}));
}
while (running) { while (running) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
window->beginRender(); window->beginRender();
for (auto square : squares) { square1.Draw(renderer);
square->Draw(renderer); square2.Draw(renderer);
} square3.Draw(renderer);
square4.Draw(renderer);
renderer->flush(); renderer->flush();
window->endRender(); window->endRender();
} }