void Framebuffer::clearColor() { std::unique_ptr<GLenum[]> drawBuffers(new GLenum[_layerNumber]); for (unsigned int i = 0; i < _layerNumber; ++i) { drawBuffers[i] = GL_COLOR_ATTACHMENT0 + i; } glDrawBuffers(_layerNumber, drawBuffers.get()); glClear(GL_COLOR_BUFFER_BIT); }
kit::PixelBuffer::Ptr kit::PixelBuffer::create(glm::uvec2 resolution, kit::PixelBuffer::AttachmentList colorattachments) { kit::PixelBuffer::Ptr returner = std::make_shared<kit::PixelBuffer>(); returner->m_resolution = resolution; if(colorattachments.size() == 0) { KIT_GL(glNamedFramebufferDrawBuffer(returner->m_glHandle, GL_NONE)); } else { // Keep track of attachments and create a drawbuffers std::vector<GLenum> drawBuffers(colorattachments.size()); uint32_t currAttachment = 0; // Add/create color attachments for(auto & info : colorattachments) { // Fill the drawbuffer GLenum currEnum = GL_COLOR_ATTACHMENT0+ currAttachment; drawBuffers[currAttachment] = currEnum; currAttachment++; // Add texture if exists, otherwise create it if(info.texture != nullptr) { // Assert resolution if(info.texture->getResolution().x != resolution.x || info.texture->getResolution().y != resolution.y) { KIT_THROW("Pixelbuffer attachments must be of the same size"); } returner->m_colorAttachments.push_back(info.texture); KIT_GL(glNamedFramebufferTexture(returner->m_glHandle, currEnum, info.texture->getHandle(), 0)); } else { kit::Texture::Ptr adder = kit::Texture::create2D(resolution, info.format, info.edgeSamplingMode, info.minFilteringMode, info.magFilteringMode); returner->m_colorAttachments.push_back(adder); KIT_GL(glNamedFramebufferTexture(returner->m_glHandle, currEnum, adder->getHandle(), 0)); } } // Set drawbuffers KIT_GL(glNamedFramebufferDrawBuffers(returner->m_glHandle, (GLsizei)drawBuffers.size(), &drawBuffers[0])); } return returner; }
Pyramid::Pyramid(int width, int height, std::string pushFragmentShaderPath, std::string pullFragmentShaderPath = "") { pushShaderProgram = new ShaderProgram("/Filters/fullscreen.vert", pushFragmentShaderPath); if (pullFragmentShaderPath == "") { pullShaderProgram = NULL; } else { pullShaderProgram = new ShaderProgram("/Filters/fullscreen.vert", pullFragmentShaderPath); } vertexArrayObject = new Quad(); int numTextures = pushShaderProgram->outputMap.size(); std::vector<GLuint> textures(numTextures); std::vector<GLuint> drawBuffers(numTextures); glGenTextures(numTextures, &textures[0]); for (auto e : pushShaderProgram->outputMap) { GLuint handle = textures[e.second.location]; glBindTexture(GL_TEXTURE_2D, handle); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, width, height, 0, GL_RGBA, GL_FLOAT, 0); // glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); glGenerateMipmap(GL_TEXTURE_2D); drawBuffers[e.second.location] = GL_COLOR_ATTACHMENT0 + e.second.location; pushShaderProgram->texture("pyramid_" + e.first, handle); if (pullShaderProgram != NULL) { pullShaderProgram->texture("pyramid_" + e.first, handle); } textureMap[e.first] = handle; } int mipmapNumber = (int)glm::log2(glm::max<float>(width, height)); fboHandles.resize(mipmapNumber); glGenFramebuffers(mipmapNumber, &fboHandles[0]); for (int i = 0; i < mipmapNumber; i++) { glBindFramebuffer(GL_FRAMEBUFFER, fboHandles[i]); for (int j = 0; j < numTextures; j++) { glFramebufferTexture2D(GL_FRAMEBUFFER, drawBuffers[j], GL_TEXTURE_2D, textures[j], i); } } glBindFramebuffer(GL_FRAMEBUFFER, 0); }
void dead() { while (kb_AnyKey()) { } exitSection = false; while (exitSection == false) { drawBoardRF(); drawBuffers(); if (!darkMode) { gc_SetColor(0xFF, gc_RGBTo1555(255, 255, 255)); } else { gc_SetColor(0xFF, gc_RGBTo1555(26, 26, 26)); } key = kb_ScanGroup(kb_group_6); if (key & kb_Clear) { exitSection = true; } key = kb_ScanGroup(kb_group_1); if (!(key & kb_Mode)) { gc_SetColorIndex(0x73); gc_NoClipRectangle(0,40, 320, 40); gc_SetColor(0x78, gc_RGBTo1555(255, 255, 255)); gc_SetTextColor(0x7378); gc_SetTextXY(125, 50); gc_PrintString("Game Over"); gc_SetTextXY(139, 60); gc_PrintInt(score, 5); } if (key & kb_2nd) { exitSection = true; quit = true; } gc_SwapDraw(); gc_FillScrn(0xFF); } if (quit) { quit = false; startGame(); } else { main(); } }
FrameBufferObject::FrameBufferObject(std::map<std::string, ShaderProgram::Info>* outputMap, int width, int height) : width(width), height(height) { int size = outputMap->size(); glGenFramebuffers(1, &frameBufferObjectHandle); glBindFramebuffer(GL_FRAMEBUFFER, frameBufferObjectHandle); std::vector<GLuint> drawBuffers(size); drawBuffers.resize(size); for (auto e : *outputMap) { GLuint handle; glGenTextures(1, &handle); glBindTexture(GL_TEXTURE_2D, handle); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, width, height, 0, GL_RGBA, GL_FLOAT, 0); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); GLuint currentAttachment = GL_COLOR_ATTACHMENT0 + e.second.location; glFramebufferTexture2D(GL_FRAMEBUFFER, currentAttachment, GL_TEXTURE_2D, handle, 0); textureMap[e.first] = handle; drawBuffers[e.second.location] = currentAttachment; } glDrawBuffers(size, &drawBuffers[0]); //TODO how to acces colorTexture from outside of this fbo??? // glGenTextures(1, &colorAttachment); // glBindTexture( GL_TEXTURE_2D, colorAttachment); // glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, width, height, 0, GL_RGBA, GL_FLOAT, 0); //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); //glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorAttachment, 0); GLuint depthTexture; glGenTextures( 1, &depthTexture); glBindTexture( GL_TEXTURE_2D, depthTexture); glTexImage2D(GL_TEXTURE_2D, 0,GL_DEPTH_COMPONENT16, width, height, 0,GL_DEPTH_COMPONENT, GL_FLOAT, 0); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depthTexture, 0); }
void FrameBuffer::bind() { glBindFramebuffer(GL_DRAW_FRAMEBUFFER, buffer()); if (isDirty()) { resetFrameBuffer(); } size_t drawBufferSize = m_textureTargets.size(); if (drawBufferSize > 0) { std::vector< GLenum > drawBuffers(drawBufferSize); for (size_t i = 0; i < drawBufferSize; ++i) { drawBuffers[i] = GL_COLOR_ATTACHMENT0 + i; } glDrawBuffers(drawBufferSize, &drawBuffers.front()); } glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); }
void startGame() { gc_InitGraph(); gc_DrawBuffer(); gc_SetTextColor(0xFF00); gc_FillScrn(0xFF); gc_SwapDraw(); srand(*(unsigned long*)0xF30044); clearTile(&buffer1); clearTile(&buffer2); clearTile(&buffer3); setRandomTile(&buffer1); setRandomTile(&buffer2); setRandomTile(&buffer3); buffer1Active = true; buffer2Active = true; buffer3Active = true; currentBufferInUse = 1; exitSection = false; movesRemaining = true; boardx = 3; boardy = 18; selectx = 0; selecty = 0; score = 0; drawBoardStart(); canDrawTileBool = true; while (exitSection == false) { checkBuf(); drawBoardRF(); gc_SetTextXY(275, 5); gc_PrintInt(score, 5); if (currentBufferInUse == 1) { drawTileHover(buffer1, selectx, selecty); } if (currentBufferInUse == 2) { drawTileHover(buffer2, selectx, selecty); } if (currentBufferInUse == 3) { drawTileHover(buffer3, selectx, selecty); } /*if (canDrawTileBool == true) { gc_SetColorIndex(0x47); gc_NoClipRectangleOutline(selectx * 21 + boardx, selecty * 21 + boardy, 21, 21); } else { gc_SetColorIndex(0xE0); gc_NoClipRectangleOutline(selectx * 21 + boardx, selecty * 21 + boardy, 21, 21); }*/ drawBuffers(); gc_SwapDraw(); if (!darkMode) { gc_SetColor(0xFF, gc_RGBTo1555(255, 255, 255)); } else { gc_SetColor(0xFF, gc_RGBTo1555(26, 26, 26)); } gc_FillScrn(0xFF); key = kb_ScanGroup(kb_group_7); if (key & kb_Down) { if (currentBufferInUse == 1) { inBounds(buffer1, selectx, selecty+1); } if (currentBufferInUse == 2) { inBounds(buffer2, selectx, selecty+1); } if (currentBufferInUse == 3) { inBounds(buffer3, selectx, selecty+1); } if (selecty < 9 && canDrawTileBool) { selecty++; if (currentBufferInUse == 1) { canDrawTile(buffer1, selectx, selecty); } if (currentBufferInUse == 2) { canDrawTile(buffer2, selectx, selecty); } if (currentBufferInUse == 3) { canDrawTile(buffer3, selectx, selecty); } } } if (key & kb_Up) { if (currentBufferInUse == 1) { inBounds(buffer1, selectx, selecty-1); } if (currentBufferInUse == 2) { inBounds(buffer2, selectx, selecty-1); } if (currentBufferInUse == 3) { inBounds(buffer3, selectx, selecty-1); } if (selecty > 0 && canDrawTileBool) { selecty--; if (currentBufferInUse == 1) { canDrawTile(buffer1, selectx, selecty); } if (currentBufferInUse == 2) { canDrawTile(buffer2, selectx, selecty); } if (currentBufferInUse == 3) { canDrawTile(buffer3, selectx, selecty); } } } if (key & kb_Left) { if (currentBufferInUse == 1) { inBounds(buffer1, selectx-1, selecty); } if (currentBufferInUse == 2) { inBounds(buffer2, selectx-1, selecty); } if (currentBufferInUse == 3) { inBounds(buffer3, selectx-1, selecty); } if (selectx > 0 && canDrawTileBool) { selectx--; if (currentBufferInUse == 1) { canDrawTile(buffer1, selectx, selecty); } if (currentBufferInUse == 2) { canDrawTile(buffer2, selectx, selecty); } if (currentBufferInUse == 3) { canDrawTile(buffer3, selectx, selecty); } } } if (key & kb_Right) { if (currentBufferInUse == 1) { inBounds(buffer1, selectx+1, selecty); } if (currentBufferInUse == 2) { inBounds(buffer2, selectx+1, selecty); } if (currentBufferInUse == 3) { inBounds(buffer3, selectx+1, selecty); } if (selectx < 9 && canDrawTileBool) { selectx++; if (currentBufferInUse == 1) { canDrawTile(buffer1, selectx, selecty); } if (currentBufferInUse == 2) { canDrawTile(buffer2, selectx, selecty); } if (currentBufferInUse == 3) { canDrawTile(buffer3, selectx, selecty); } } } if (selectx > 9 || selectx < 0) { selectx = 0; } if (selecty > 9 || selecty < 0) { selecty = 0; } key = kb_ScanGroup(kb_group_6); if (key & kb_Clear) { exitSection = true; } key = kb_ScanGroup(kb_group_1); if (key & kb_2nd) { if (currentBufferInUse == 1) { canDrawTile(buffer1, selectx, selecty); } if (currentBufferInUse == 2) { canDrawTile(buffer2, selectx, selecty); } if (currentBufferInUse == 3) { canDrawTile(buffer3, selectx, selecty); } if (canDrawTileBool) { if (currentBufferInUse == 1) { drawTile(buffer1, selectx, selecty); } if (currentBufferInUse == 2) { drawTile(buffer2, selectx, selecty); } if (currentBufferInUse == 3) { drawTile(buffer3, selectx, selecty); } if (currentBufferInUse == 1) { buffer1Active = false; clearTile(&buffer1); } if (currentBufferInUse == 2) { buffer2Active = false; clearTile(&buffer2); } if (currentBufferInUse == 3) { buffer3Active = false; clearTile(&buffer3); } currentBufferInUse++; if (currentBufferInUse == 4) { currentBufferInUse = 1; } checkBuf(); checkForTileRows(); if (currentBufferInUse == 1) { canDrawTile(buffer1, selectx, selecty); } if (currentBufferInUse == 2) { canDrawTile(buffer2, selectx, selecty); } if (currentBufferInUse == 3) { canDrawTile(buffer3, selectx, selecty); } anyMovesLeft(); if (!movesRemaining) { exitSection = true; } } } if (key & kb_Mode) { darkMode = !darkMode; while (kb_AnyKey()) { } } key = kb_ScanGroup(kb_group_2); if (key & kb_Alpha) { currentBufferInUse++; if (currentBufferInUse == 4) { currentBufferInUse = 1; } checkBuf(); dbg_printf(dbgout, "cbiu %d", currentBufferInUse); while (kb_AnyKey()) { } } } saveNewHS(score); dead(); }
Framebuffer::Framebuffer(unsigned int width, unsigned int height, const std::vector<Descriptor> & descriptors, bool depthBuffer) { _width = width; _height = height; // Create a framebuffer. glGenFramebuffers(1, &_id); glBindFramebuffer(GL_FRAMEBUFFER, _id); bool depthBufferSetup = false; for(size_t i = 0; i < descriptors.size(); ++i){ // Create the color texture to store the result. const auto & descriptor = descriptors[i]; GLuint type, format; GLUtilities::getTypeAndFormat(descriptor.typedFormat, type, format); if(format == GL_DEPTH_COMPONENT || format == GL_DEPTH_STENCIL){ glGenTextures(1, &_idDepth); glBindTexture(GL_TEXTURE_2D, _idDepth); glTexImage2D(GL_TEXTURE_2D, 0, descriptor.typedFormat, (GLsizei)_width , (GLsizei)_height, 0, format, type, 0); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, (GLint)descriptor.filtering); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, (GLint)descriptor.filtering); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, (GLint)descriptor.wrapping); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, (GLint)descriptor.wrapping); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0); if(descriptor.wrapping == GL_CLAMP_TO_BORDER){ // Setup the border value for the shadow map GLfloat border[] = { 1.0, 1.0, 1.0, 1.0 }; glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, border); } // Link the texture to the depth attachment of the framebuffer. glFramebufferTexture2D(GL_FRAMEBUFFER, (format == GL_DEPTH_STENCIL ? GL_DEPTH_STENCIL_ATTACHMENT : GL_DEPTH_ATTACHMENT), GL_TEXTURE_2D, _idDepth, 0); depthBufferSetup = true; _depthUse = TEXTURE; _depthDescriptor = descriptor; glBindTexture(GL_TEXTURE_2D, 0); } else { GLuint idColor = 0; glGenTextures(1, &idColor); glBindTexture(GL_TEXTURE_2D, idColor); glTexImage2D(GL_TEXTURE_2D, 0, descriptor.typedFormat, (GLsizei)_width , (GLsizei)_height, 0, format, type, 0); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, (GLint)descriptor.filtering); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, (GLint)descriptor.filtering); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, (GLint)descriptor.wrapping); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, (GLint)descriptor.wrapping); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0); if(descriptor.wrapping == GL_CLAMP_TO_BORDER){ // Setup the border value for the shadow map GLfloat border[] = { 1.0, 1.0, 1.0, 1.0 }; glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, border); } // Link the texture to the color attachment (ie output) of the framebuffer. glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + GLuint(_idColors.size()), GL_TEXTURE_2D, idColor, 0); _idColors.push_back(idColor); _colorDescriptors.push_back(descriptor); glBindTexture(GL_TEXTURE_2D, 0); } } if (!depthBufferSetup) { if (depthBuffer){ // Create the renderbuffer (depth buffer). glGenRenderbuffers(1, &_idDepth); glBindRenderbuffer(GL_RENDERBUFFER, _idDepth); // Setup the depth buffer storage. glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT32F, (GLsizei)_width, (GLsizei)_height); // Link the renderbuffer to the framebuffer. glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, _idDepth); _depthUse = RENDERBUFFER; } else { _depthUse = NONE; } } //Register which color attachments to draw to. std::vector<GLenum> drawBuffers(_idColors.size()); for(size_t i = 0; i < _idColors.size(); ++i){ drawBuffers[i] = GL_COLOR_ATTACHMENT0 + GLuint(i); } glDrawBuffers(GLsizei(drawBuffers.size()), &drawBuffers[0]); checkGLFramebufferError(); glBindFramebuffer(GL_FRAMEBUFFER, 0); checkGLError(); }
//! Convenience. template <std::size_t N> inline void drawBuffers(std::array<GLenum, N> const& bufs) { drawBuffers(static_cast<GLsizei>(bufs.size()), bufs.data()); }