예제 #1
0
void GL_RenderBuffer::createRenderBufferStorage(int buffer, int type, int attachment)
{
	glRenderbufferStorageEXT(
		GL_RENDERBUFFER_EXT, type, settings.width, settings.height);
	CheckLastErrorGL( "Could not create renderbuffer object storage" );

	glFramebufferRenderbufferEXT(
		GL_FRAMEBUFFER_EXT, attachment, GL_RENDERBUFFER_EXT, buffer);
	CheckLastErrorGL( "Could not attach renderbuffer into framebuffer object" );
}
예제 #2
0
void GL_RenderBuffer::unbind()
{
	glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
	CheckLastErrorGL( "Could not unbind framebuffer object" );
	
	glDrawBuffer(GL_BACK);
	glReadBuffer(GL_BACK);

	bound = false;
}
예제 #3
0
void GL_RenderBuffer::bind()
{
	//if(bound) return;

	glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, id);
	CheckLastErrorGL( "Could not bind framebuffer object" );

	setBufferState();
	bound = true;
}
예제 #4
0
GL_RenderBuffer::~GL_RenderBuffer()
{
	glDeleteFramebuffersEXT(1, (GLuint*) &id);

	for( size_t i = 0; i < renderBuffers.size(); i++ )
	{
		uint32 buffer = renderBuffers[i];

		glDeleteRenderbuffersEXT(1, (GLuint*) &buffer);
		CheckLastErrorGL( "Could not delete renderbuffer object" );
	}
}
예제 #5
0
void BindGenericVertexBufferDeclarations(VertexBuffer* vb)
{
	const GeometryBuffer* gb = vb->getGeometryBuffer();
	const std::vector<VertexElement>& decls = gb->declarations.decls;

	for( size_t i = 0; i < decls.size(); i++ )
	{
		const VertexElement& decl = decls[i];
		int index = (int) decl.attribute;

		glEnableVertexAttribArray(index);

		CheckLastErrorGL("Error enabling vertex attribute array");

		GLenum type = ConvertBufferTypeGL(decl.type);
		
		glVertexAttribPointer(index, decl.components, type, GL_FALSE,
			decl.stride, (void*) decl.offset );

		CheckLastErrorGL("Error binding pointers to buffer");
	}
}
예제 #6
0
void GL_RenderBuffer::createRenderBuffer( RenderBufferType bufferComponents )
{
	// Render buffers are just objects which are used to support
	// offscreen rendering, often for sections of the framebuffer which 
	// don’t have a texture format associated with them.

	if( !checkSize() ) return;

	GLuint renderBuffer;
	glGenRenderbuffersEXT(1, &renderBuffer);
	CheckLastErrorGL( "Could not generate renderbuffer object" );

	glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, renderBuffer);
	CheckLastErrorGL( "Could not bind renderbuffer object" );

	bind();

	if( BitwiseAnd(bufferComponents, RenderBufferType::Depth) )
	{
		createRenderBufferStorage(renderBuffer,
			GL_DEPTH_COMPONENT, GL_DEPTH_ATTACHMENT_EXT);
	}
	if( BitwiseAnd(bufferComponents, RenderBufferType::Color) )
	{
		createRenderBufferStorage(renderBuffer,
			GL_RGBA, GL_COLOR_ATTACHMENT0_EXT);
		colorAttach = true;
	}
	if( BitwiseAnd(bufferComponents, RenderBufferType::Stencil) )
	{
		createRenderBufferStorage(renderBuffer,
			GL_STENCIL_INDEX, GL_STENCIL_ATTACHMENT_EXT);
		colorAttach = true;
	}

	glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0);

	unbind();
}
예제 #7
0
NAMESPACE_GRAPHICS_BEGIN

//-----------------------------------//

GL_RenderBuffer::GL_RenderBuffer(const Settings& settings) 
	: RenderBuffer(settings)
	, bound(false)
	, valid(false)
	, colorAttach(false)
{
	glGenFramebuffersEXT(1, (GLuint*) &id);
	CheckLastErrorGL( "Could not create framebuffer object" );
}
예제 #8
0
void UnbindGenericVertexBufferDeclarations(VertexBuffer* vb)
{
	const GeometryBuffer* gb = vb->getGeometryBuffer();
	const std::vector<VertexElement>& decls = gb->declarations.decls;

	for( size_t i = 0; i < decls.size(); i++ )
	{
		const VertexElement& decl = decls[i];

		int index = (int) decl.attribute;
		glDisableVertexAttribArray(index);

		CheckLastErrorGL("Error disabling vertex attribute array");
	}
}
예제 #9
0
void GL_RenderBuffer::attachRenderTexture(const TexturePtr& tex)
{
	bind();

	GLint attach = GL_COLOR_ATTACHMENT0_EXT;

	if( tex->getPixelFormat() == PixelFormat::Depth )
		attach = GL_DEPTH_ATTACHMENT_EXT;

	glFramebufferTexture2DEXT(
		GL_FRAMEBUFFER_EXT, attach, GL_TEXTURE_2D, tex->getId(), 0);
	CheckLastErrorGL( "Could not attach texture into framebuffer object" );
	
	textureBuffers.push_back( tex );

	unbind();
}