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);
	}
Esempio n. 2
0
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;
}
Esempio n. 3
0
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);
}
Esempio n. 4
0
File: main.c Progetto: ez80/1010CE
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);
}
Esempio n. 6
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);
	}
Esempio n. 7
0
File: main.c Progetto: ez80/1010CE
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();
}
Esempio n. 8
0
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();

}
Esempio n. 9
0
//! Convenience.
template <std::size_t N> inline
void drawBuffers(std::array<GLenum, N> const& bufs)
{
  drawBuffers(static_cast<GLsizei>(bufs.size()), bufs.data());
}