added color to attribute buffer
This commit is contained in:
@ -40,10 +40,10 @@ SpriteRenderer::SpriteRenderer() {
|
||||
|
||||
//Initialize Resources
|
||||
float vertexData[] = {
|
||||
0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f,
|
||||
1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f,
|
||||
1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f,
|
||||
0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f
|
||||
0.0f, 0.0f, 0.0f,
|
||||
1.0f, 0.0f, 0.0f,
|
||||
1.0f, 1.0f, 0.0f,
|
||||
0.0f, 1.0f, 0.0f
|
||||
};
|
||||
|
||||
unsigned int indices[]{
|
||||
@ -56,19 +56,20 @@ SpriteRenderer::SpriteRenderer() {
|
||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
|
||||
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData), vertexData, 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(1, 4, GL_FLOAT, GL_FALSE, 7 * sizeof(float), (void*)(3 * sizeof(float)));
|
||||
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, instanceVBO);
|
||||
glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, 16 * sizeof(float), (void*)0);
|
||||
glVertexAttribPointer(3, 4, GL_FLOAT, GL_FALSE, 16 * sizeof(float), (void*)(sizeof(float) * 4));
|
||||
glVertexAttribPointer(4, 4, GL_FLOAT, GL_FALSE, 16 * sizeof(float), (void*)(sizeof(float) * 8));
|
||||
glVertexAttribPointer(5, 4, GL_FLOAT, GL_FALSE, 16 * sizeof(float), (void*)(sizeof(float) * 12));
|
||||
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 20 * sizeof(float), (void*)(16 * sizeof(float)));
|
||||
glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, 20 * sizeof(float), (void*)0);
|
||||
glVertexAttribPointer(3, 4, GL_FLOAT, GL_FALSE, 20 * sizeof(float), (void*)(sizeof(float) * 4));
|
||||
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(1);
|
||||
glEnableVertexAttribArray(2);
|
||||
glEnableVertexAttribArray(3);
|
||||
glEnableVertexAttribArray(4);
|
||||
glEnableVertexAttribArray(5);
|
||||
glVertexAttribDivisor(1, 1);
|
||||
glVertexAttribDivisor(2, 1);
|
||||
glVertexAttribDivisor(3, 1);
|
||||
glVertexAttribDivisor(4, 1);
|
||||
@ -131,13 +132,13 @@ SpriteRenderer::~SpriteRenderer() {
|
||||
glDeleteProgram(shaderProgram);
|
||||
}
|
||||
|
||||
void SpriteRenderer::drawSprite(glm::mat4 transform) {
|
||||
matrices.push_back(transform);
|
||||
void SpriteRenderer::drawSprite(glm::mat4 transform, glm::vec4 color) {
|
||||
matrices.push_back(instance{transform, color});
|
||||
}
|
||||
|
||||
void SpriteRenderer::flush() {
|
||||
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);
|
||||
glUseProgram(shaderProgram);
|
||||
glDrawElementsInstanced(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0, matrices.size());
|
||||
|
@ -2,15 +2,20 @@
|
||||
#include <vector>
|
||||
#include <glm/glm.hpp>
|
||||
|
||||
struct instance {
|
||||
glm::mat4 model;
|
||||
glm::vec4 color;
|
||||
};
|
||||
|
||||
class SpriteRenderer {
|
||||
private:
|
||||
unsigned int VAO, VBO, EBO, instanceVBO, shaderProgram;
|
||||
std::vector<glm::mat4> matrices;
|
||||
std::vector<instance> matrices;
|
||||
|
||||
public:
|
||||
SpriteRenderer();
|
||||
~SpriteRenderer();
|
||||
void drawSprite(glm::mat4 transform);
|
||||
void drawSprite(glm::mat4 transform, glm::vec4 color);
|
||||
void flush();
|
||||
};
|
||||
|
||||
|
@ -22,5 +22,5 @@ void Square::Draw(SpriteRenderer* renderer) {
|
||||
//glBindVertexArray(VAO);
|
||||
//glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
|
||||
//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);
|
||||
glBindBuffer(GL_UNIFORM_BUFFER, 0);
|
||||
glBindBufferBase(GL_UNIFORM_BUFFER, PROJ_MAT_UNIFORM_BUFFER, uniformBuffer);
|
||||
|
||||
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
|
||||
}
|
||||
|
||||
void deinit() {
|
||||
@ -103,18 +101,17 @@ void render() {
|
||||
INFO("Render thread starting");
|
||||
renderInit();
|
||||
SpriteRenderer* renderer = new SpriteRenderer();
|
||||
std::vector<Square*> squares;
|
||||
for (int i = 0; i < 100 * 100; i++) {
|
||||
int x = i % 100;
|
||||
int y = i / 100;
|
||||
squares.push_back(new Square({x*6, y*6, 0}, {6, 6, 1}, {0, 0, 1, 1}));
|
||||
}
|
||||
Square square1(glm::vec3(100, 100, 0), glm::vec3(100, 100, 1), glm::vec4(1.0f, 0.0f, 0.0f, 1.0f));
|
||||
Square square2(glm::vec3(600, 100, 0), glm::vec3(100, 100, 1), glm::vec4(0.0f, 1.0f, 0.0f, 1.0f));
|
||||
Square square3(glm::vec3(100, 400, 0), glm::vec3(100, 100, 1), glm::vec4(0.0f, 0.0f, 1.0f, 1.0f));
|
||||
Square square4(glm::vec3(600, 400, 0), glm::vec3(100, 100, 1), glm::vec4(0.7f, 0.7f, 0.3f, 1.0f));
|
||||
while (running) {
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||
window->beginRender();
|
||||
for (auto square : squares) {
|
||||
square->Draw(renderer);
|
||||
}
|
||||
square1.Draw(renderer);
|
||||
square2.Draw(renderer);
|
||||
square3.Draw(renderer);
|
||||
square4.Draw(renderer);
|
||||
renderer->flush();
|
||||
window->endRender();
|
||||
}
|
||||
|
Reference in New Issue
Block a user