4 #include <glm/gtc/type_ptr.hpp>
16 std::string& vertShader,
17 unsigned int windowWidth,
18 unsigned int windowHeight,
19 unsigned int numColourAttachments) :
20 m_fragmentShaderPath(fragShader),
21 m_vertexShaderPath(vertShader) {
22 m_camera = std::make_unique<Camera2D>();
23 m_camera->init(windowWidth, windowHeight);
25 m_camera->setScale(windowWidth / 2.0f, windowHeight / 2.0f);
43 glColorMaski(index, GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
47 glColorMaski(index, GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
52 glColorMaski(i, GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
58 glColorMaski(i, GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
66 link({
"vertexPosition",
"vertexColour",
"vertexUV"});
75 (
void*)offsetof(
Vertex, colour));
95 GLenum m_colourAttachments[attachments];
98 glGetIntegerv(GL_MAX_DRAW_BUFFERS, &max);
100 for(
unsigned int i = 0; i < attachments;
102 m_colourAttachments[i] = (GL_COLOR_ATTACHMENT0 + i);
113 GLint colourTexture = i;
125 glDeleteFramebuffers(1, &
m_fboID);
144 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
147 glEnable(GL_DEPTH_TEST);
149 glDepthMask(GL_TRUE);
151 glDepthFunc(GL_ALWAYS);
157 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
174 glDisable(GL_DEPTH_TEST);
178 glm::mat4 matrix =
m_camera->getCameraMatrix();
198 glm::vec2 position = glm::vec2(-1.0f);
199 glm::vec2 size = glm::vec2(2.0f);
201 glm::vec4 destRect(position.x, position.y, size.x, size.y);
202 glm::vec4 uvRect(0.0f, 1.0f, 1.0f, -1.0f);
208 std::vector<Vertex> vertices;
215 vertices[0] = fullscreen.
topLeft;
220 vertices[5] = fullscreen.
topLeft;
226 glBufferData(GL_ARRAY_BUFFER, vertices.size() *
sizeof(
Vertex), vertices.data(), GL_DYNAMIC_DRAW);
250 for(
unsigned int i = 0; i <
m_batches.size();
257 glDrawArrays(GL_TRIANGLES, (GLint)
m_batches[i].offset, (GLsizei)
m_batches[i].numVertices);
284 GLenum attachmentType =
286 switch(attachmentType) {
287 case GL_DEPTH_ATTACHMENT:
300 glTexImage2D(GL_TEXTURE_2D,
303 m_camera->getViewspaceResolution().x,
304 m_camera->getViewspaceResolution().y,
312 glTexImage2D(GL_TEXTURE_2D,
315 m_camera->getViewspaceResolution().x,
316 m_camera->getViewspaceResolution().y,
325 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
326 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
327 float backColour[] = {0.0f, 0.0f, 0.0f, 0.0f};
328 glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, backColour);
329 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
330 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
334 glFramebufferTexture2D(GL_FRAMEBUFFER, attachmentType, GL_TEXTURE_2D,
m_textureIDs[i], 0);
343 glGenFramebuffers(1, &
m_fboID);
346 glBindFramebuffer(GL_FRAMEBUFFER,
m_fboID);
352 GLint status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
353 if(status != GL_FRAMEBUFFER_COMPLETE) {
360 glBindFramebuffer(GL_FRAMEBUFFER, 0);
365 glBindFramebuffer(GL_FRAMEBUFFER,
m_fboID);
381 glBindFramebuffer(GL_FRAMEBUFFER, 0);