52 GLuint
id [[maybe_unused]],
54 GLsizei length [[maybe_unused]],
55 const GLchar* message,
56 const void* userParam [[maybe_unused]])
58 if (type == GL_DEBUG_TYPE_OTHER || type == GL_DEBUG_TYPE_PERFORMANCE)
61 fprintf(stderr,
"GL CALLBACK: %s type = 0x%x, severity = 0x%x,\nmessage = %s\n",
62 (type == GL_DEBUG_TYPE_ERROR ?
"** GL ERROR **" :
""),
63 type, severity, message);
75 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
76 glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
78 glfwWindowHint(GLFW_SAMPLES, 4);
79 glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_COMPAT_PROFILE);
82 glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
87 GLFWwindow* window = glfwCreateWindow(
SCR_WIDTH,
SCR_HEIGHT,
"Batched Rendering",
nullptr,
nullptr);
88 if (window ==
nullptr) {
89 std::cout <<
"Failed to create GLFW window" << std::endl;
93 glfwMakeContextCurrent(window);
98 if (gladLoadGLLoader(
reinterpret_cast<GLADloadproc
>(glfwGetProcAddress)) == 0) {
99 std::cout <<
"Failed to initialize GLAD" << std::endl;
104 glEnable(GL_DEBUG_OUTPUT);
108 glEnable(GL_MULTISAMPLE);
116 const std::array<const float, 12> vertices {
117 0.001F, 0.001F, 0.0F,
118 0.001F, -0.001F, 0.0F,
119 -0.001F, -0.001F, 0.0F,
120 -0.001F, 0.001F, 0.0F,
123 const std::array<const unsigned int, 6> indices {
132 { u_type::vec3,
"aPos" }
136 { u_type::vec3,
"instancePos" }
153 { shader_array_type::float32_arr,
"u_color", 4 }
160 std::array<float, 4> color {};
164 const float START = -0.95F;
165 const float END = 0.95F;
167 const float Z_START = 0.01F;
168 const float Z_END = 1.00F;
170 std::srand(
static_cast<unsigned int>(std::time(
nullptr)));
171 constexpr int32_t NUM_INSTANCES = 65535;
173 for (
int i = 0; i < NUM_INSTANCES; i++) {
174 std::array<float, 3> offset = {
176 static_cast<float>(rand()) /
static_cast<float>(RAND_MAX)),
178 static_cast<float>(rand()) /
static_cast<float>(RAND_MAX)),
180 static_cast<float>(rand()) /
static_cast<float>(RAND_MAX))
187 while (glfwWindowShouldClose(window) == 0) {
191 glClearColor(0.2F, 0.3F, 0.3F, 1.0F);
192 glClear(GL_COLOR_BUFFER_BIT);
194 auto timeNow =
static_cast<float>(glfwGetTime());
196 for (
float& col : color) {
197 col = std::sin(timeNow) / 2.0F + 0.5F;
201 for (
int i = 0; i < 4; ++i) {
202 UBO_block.set_attribute_data(std::span { &color[i], 1 },
"u_color", i);
214 static_assert(
sizeof(
vec3) == 3 *
sizeof(
float));
218 [](std::span<vec3> data) {
220 std::for_each(std::execution::par_unseq, data.begin(), data.end(),
222 const float speed = ((static_cast<float>(std::rand()) / static_cast<float>(RAND_MAX)) - 0.5F) / 1000.0F;
228 glDrawElementsInstanced(GL_TRIANGLES, VAO.
index_data().count(), GL_UNSIGNED_INT,
nullptr,
231 glfwSwapBuffers(window);
void GLAPIENTRY MessageCallback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message, const void *userParam)