added color to attribute buffer
This commit is contained in:
@ -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());
|
||||||
|
@ -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();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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);
|
||||||
}
|
}
|
@ -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();
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user