Ejemplo n.º 1
0
		void WindowsShadowRenderer::setupDraw()
		{
			Core::SmartPtr<Rendering::BufferBase> dynamicBuffer = BufferManager::get()->getDynamicBuffer();
			unsigned int dynamicBufferID = BufferManager::get()->getDynamicBuffer()->getCurrBufferID();
			if (_fbo == 0) createFrameBuffer();
			glViewport(0, 0, _bufferWidth, _bufferHeight);
			DriverInterface::DriverInterfaceBase::checkError(__FILE__, __LINE__);
			glBindFramebuffer(GL_FRAMEBUFFER, _fbo);
			DriverInterface::DriverInterfaceBase::checkError(__FILE__, __LINE__);
			checkFrameBufferStatus();
			//const float one = 1.0f;
			//glClearBufferfv(GL_DEPTH, 0, &one);
			DriverInterface::DriverInterfaceBase::checkError(__FILE__, __LINE__);
			glUseProgram(_program);
			DriverInterface::DriverInterfaceBase::checkError(__FILE__, __LINE__);
			glBindBufferRange(GL_UNIFORM_BUFFER, 13, dynamicBufferID, _sliceMatrixBase, _sliceMatrixSize);
			DriverInterface::DriverInterfaceBase::checkError(__FILE__, __LINE__);
		}
Ejemplo n.º 2
0
void FrameBufferObject::textureAttach()
{
	GLenum FBOstatus;
	glBindFramebuffer(GL_FRAMEBUFFER, FBOHandle);

	glReadBuffer(GL_NONE);
	vector<GLint> loc;

	for (int j = 0; j < shaderOut.size(); ++j)
	{
		GLint location = glGetFragDataLocation(shaderProg, (const GLchar*)shaderOut[j]);
		loc.push_back(location);
	}

	int numTextures = textures.size();
	GLenum* drawBufs = new GLenum[numTextures];

	for (int k = 0; k < texAttachLoc.size(); ++k)
	{
		GLint location = loc[k];
		drawBufs[location] = texAttachLoc[k];
	}

	glDrawBuffers(numTextures, drawBufs);

	for (int m = 0; m < numTextures; ++m)
	{
		glBindTexture(GL_TEXTURE_2D, textures[m]);
		glFramebufferTexture2D(GL_FRAMEBUFFER, drawBufs[loc[m]], GL_TEXTURE_2D, textures[m], 0);
	}

	FBOstatus = glCheckFramebufferStatus(GL_FRAMEBUFFER);

	if (FBOstatus != GL_FRAMEBUFFER_COMPLETE)
	{
		printf("GL_FRAMEBUFFER_COMPLETE FAILED\n");
		checkFrameBufferStatus(FBOstatus);
	}

	delete drawBufs;
}
void GLRenderTarget::recreate(math::vector2di newSize,EPixelFormat format,bool depthBuffer){
 
	m_size=newSize;

	core::string tmpStr;
	bind();
	for (int i{}i<m_ColorTex.size();++i)
	{
		if(m_ColorTex[i]){
			//glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT+i,GL_TEXTURE_2D, m_ColorTex[i]->getTextureID(),0);
			m_ColorTex[i]->recreate(format,newSize.x,newSize.y,m_numSamples);
			m_ColorTex[i]->bind(GL_COLOR_ATTACHMENT0_EXT+i);
		}
		else{
			//glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,GL_RENDERBUFFER_EXT, 0);
			glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT+i,GL_RENDERBUFFER_EXT, 0,0);
		}
	}
	
	if(depthBuffer){
		if(!m_DepthTex){
			m_DepthTex=new RenderTextureBuffer(m_device,EPixel_DEPTH,m_size.x,m_size.y,m_numSamples);
			tmpStr=m_name+L"_DepthTex";
			m_DepthTex->setResourceName(tmpStr.c_str());
		}else
			m_DepthTex->recreate(EPixel_DEPTH,m_size.x,m_size.y,m_numSamples);
		m_DepthTex->bind(GL_DEPTH_ATTACHMENT_EXT);
	}
	else
		glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,GL_RENDERBUFFER_EXT, 0);
		//glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,GL_TEXTURE_2D, 0,0);
	//glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT,GL_RENDERBUFFER_EXT, 0);
	glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT,GL_RENDERBUFFER_EXT, 0,0);

	checkFrameBufferStatus();

	unbind();
}
Ejemplo n.º 4
0
bool PCSSShadowMap::initFBO(DrawEnv *pEnv)
{
    if(_useFBO)
    {
        Int32   width = _shadowVP->getPixelWidth();
        Int32   height = _shadowVP->getPixelHeight();

        if(width <= 0 || height <= 0)
            return false;

        if(_fb2 != 0)
            return true;

        Window *win = pEnv->getWindow();

#ifdef USE_FBO_FOR_COLOR_AND_FACTOR_MAP
        _width = _shadowVP->getPixelWidth();
        _height = _shadowVP->getPixelHeight();

        _colorMapImage->set(GL_RGB, _width, _height);

        _shadowFactorMapImage->set(GL_RGB, _width, _height);

        commitChanges();

        glGenFramebuffersEXT(1, &_fb);
        glGenRenderbuffersEXT(1, &_rb_depth);

        win->validateGLObject(_colorMap->getGLId(), pEnv);
        glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, _fb);
        glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
                                  GL_TEXTURE_2D,
                                  win->getGLObjectId(_colorMap->getGLId()), 0);
        win->validateGLObject(_shadowFactorMap->getGLId(), pEnv);
        glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT,
                                  GL_TEXTURE_2D,
                                  win->getGLObjectId(_shadowFactorMap->getGLId
                                                     ()), 0);

        //Initialize Depth Renderbuffer
        glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, _rb_depth);
        if(_useNPOTTextures)
            glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT24_ARB
                                     , _shadowVP->getPixelWidth(),
                                     _shadowVP->getPixelHeight());
        else
            glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT24_ARB
                                     , _widthHeightPOT, _widthHeightPOT);
        //Attach Renderbuffer to Framebuffer depth Buffer
        glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT
                                     , GL_RENDERBUFFER_EXT, _rb_depth);

        win->validateGLObject(_colorMap->getGLId(), pEnv);
        glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
                                  GL_TEXTURE_2D,
                                  win->getGLObjectId(_colorMap->getGLId()), 0);

        win->validateGLObject(_shadowFactorMap->getGLId(), pEnv);
        glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT,
                                  GL_TEXTURE_2D,
                                  win->getGLObjectId(_shadowFactorMap->getGLId
                                                     ()), 0);

        bool    result = checkFrameBufferStatus(win);
#endif

        glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
        glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0);

        glGenFramebuffersEXT(1, &_fb2);
        glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, _fb2);

        glDrawBuffer(GL_NONE);	// no color buffer dest
        glReadBuffer(GL_NONE);	// no color buffer src

        glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
        glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0);

    }

    return true;
}
Ejemplo n.º 5
0
		void WindowsShadowRenderer::drawScene(const ShadowRenderData& renderData)
		{
			Core::SmartPtr<Rendering::BufferBase> dynamicBuffer = BufferManager::get()->getDynamicBuffer();
			unsigned int staticBufferID = BufferManager::get()->getStaticBuffer()->getCurrBufferID();
			unsigned int dynamicBufferID = BufferManager::get()->getDynamicBuffer()->getCurrBufferID();
			DriverInterface::DriverInterfaceBase::checkError(__FILE__, __LINE__);
			glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, _tfBuffer);
			DriverInterface::DriverInterfaceBase::checkError(__FILE__, __LINE__);
			glBeginTransformFeedback(GL_TRIANGLES);
			DriverInterface::DriverInterfaceBase::checkError(__FILE__, __LINE__);
			for (auto sliceID : renderData.sliceIDs)
			{
				glUniform1i(17, sliceID);
				DriverInterface::DriverInterfaceBase::checkError(__FILE__, __LINE__);
				glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, _texture, 0, sliceID);
				glClear(GL_DEPTH_BUFFER_BIT);
				DriverInterface::DriverInterfaceBase::checkError(__FILE__, __LINE__);
				for (auto command : renderData.getCommands())
				{
					unsigned int vertexArrayBufferID = command.vertexArrayBuffer->getCurrBufferID();
					glBindBuffer(GL_ARRAY_BUFFER, vertexArrayBufferID);
					DriverInterface::DriverInterfaceBase::checkError(__FILE__, __LINE__);
					// Position
					glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, Model::GeometryBase::vertexFormatStride, (GLvoid*) command.vertexDataBase);
					DriverInterface::DriverInterfaceBase::checkError(__FILE__, __LINE__);
					glEnableVertexAttribArray(0);
					DriverInterface::DriverInterfaceBase::checkError(__FILE__, __LINE__);
					// Normal
					glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, Model::GeometryBase::vertexFormatStride,
						(GLvoid*) (command.vertexDataBase + sizeof(Math::Vector4<float>)));
					DriverInterface::DriverInterfaceBase::checkError(__FILE__, __LINE__);
					glEnableVertexAttribArray(1);
					DriverInterface::DriverInterfaceBase::checkError(__FILE__, __LINE__);
					// UV
					glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, Model::GeometryBase::vertexFormatStride,
						(GLvoid*) (command.vertexDataBase + sizeof(Math::Vector4<float>) * 2));
					DriverInterface::DriverInterfaceBase::checkError(__FILE__, __LINE__);
					glEnableVertexAttribArray(2);
					// Local to model transform
					glBindBuffer(GL_ARRAY_BUFFER, staticBufferID);
					DriverInterface::DriverInterfaceBase::checkError(__FILE__, __LINE__);
					glVertexAttribIPointer(3, 4, GL_UNSIGNED_INT, sizeof(InstanceData),
						(GLvoid*) command.localModelTransformBase);
					DriverInterface::DriverInterfaceBase::checkError(__FILE__, __LINE__);
					glEnableVertexAttribArray(3);
					DriverInterface::DriverInterfaceBase::checkError(__FILE__, __LINE__);
					glVertexAttribDivisor(3, 1);
					glVertexAttribIPointer(4, 4, GL_UNSIGNED_INT, sizeof(InstanceData),
						(GLvoid*) (command.localModelTransformBase + sizeof(Math::Vector4<float>)));
					DriverInterface::DriverInterfaceBase::checkError(__FILE__, __LINE__);
					glEnableVertexAttribArray(4);
					DriverInterface::DriverInterfaceBase::checkError(__FILE__, __LINE__);
					glVertexAttribDivisor(4, 1);
					glVertexAttribIPointer(5, 4, GL_UNSIGNED_INT, sizeof(InstanceData),
						(GLvoid*) (command.localModelTransformBase + sizeof(Math::Vector4<float>) * 2));
					DriverInterface::DriverInterfaceBase::checkError(__FILE__, __LINE__);
					glEnableVertexAttribArray(5);
					DriverInterface::DriverInterfaceBase::checkError(__FILE__, __LINE__);
					glVertexAttribDivisor(5, 1);
					glVertexAttribIPointer(6, 4, GL_UNSIGNED_INT, sizeof(InstanceData),
						(GLvoid*) (command.localModelTransformBase + sizeof(Math::Vector4<float>) * 3));
					DriverInterface::DriverInterfaceBase::checkError(__FILE__, __LINE__);
					glEnableVertexAttribArray(6);
					DriverInterface::DriverInterfaceBase::checkError(__FILE__, __LINE__);
					glVertexAttribDivisor(6, 1);
					// Instance data
					DriverInterface::DriverInterfaceBase::checkError(__FILE__, __LINE__);
					glBindBuffer(GL_ARRAY_BUFFER, dynamicBufferID);
					DriverInterface::DriverInterfaceBase::checkError(__FILE__, __LINE__);
					glVertexAttribIPointer(7, 1, GL_UNSIGNED_INT, sizeof(InstanceData),
						(GLvoid*) command.instanceDataBase);
					DriverInterface::DriverInterfaceBase::checkError(__FILE__, __LINE__);
					glEnableVertexAttribArray(7);
					DriverInterface::DriverInterfaceBase::checkError(__FILE__, __LINE__);
					glVertexAttribDivisor(7, 1);
					DriverInterface::DriverInterfaceBase::checkError(__FILE__, __LINE__);
					if (command.indexDataBase < 0)
					{
						glBindBuffer(GL_DRAW_INDIRECT_BUFFER, vertexArrayBufferID);
						DriverInterface::DriverInterfaceBase::checkError(__FILE__, __LINE__);
						glDrawArraysInstanced(GL_TRIANGLES, 0, command.numPrimitives, 1);
						checkFrameBufferStatus();
						DriverInterface::DriverInterfaceBase::checkError(__FILE__, __LINE__);
					}
					else
					{
						glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, staticBufferID);
						DriverInterface::DriverInterfaceBase::checkError(__FILE__, __LINE__);
						glDrawElementsInstanced(GL_TRIANGLES, command.numPrimitives, GL_UNSIGNED_SHORT, (GLvoid*) command.indexDataBase, 1);
						DriverInterface::DriverInterfaceBase::checkError(__FILE__, __LINE__);
					}
					DriverInterface::DriverInterfaceBase::checkError(__FILE__, __LINE__);
				}
			}
			glEndTransformFeedback();
			Math::Vector4<float>* output = (Math::Vector4<float>*)glMapBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, GL_READ_ONLY);
			//printf("Output: %d, %d, %d, %d", output[0].v[0], output[0].v[1], output[0].v[2], output[0].v[3]);
			DriverInterface::DriverInterfaceBase::checkError(__FILE__, __LINE__);
			glUnmapBuffer(GL_TRANSFORM_FEEDBACK_BUFFER);
			DriverInterface::DriverInterfaceBase::checkError(__FILE__, __LINE__);
			glDisableVertexAttribArray(0);
			glDisableVertexAttribArray(1);
			glDisableVertexAttribArray(2);
			glDisableVertexAttribArray(3);
			glDisableVertexAttribArray(4);
			glDisableVertexAttribArray(5);
			glDisableVertexAttribArray(6);
			glDisableVertexAttribArray(7);
			glVertexAttribDivisor(3, 0);
			glVertexAttribDivisor(4, 0);
			glVertexAttribDivisor(5, 0);
			glVertexAttribDivisor(6, 0);
			glVertexAttribDivisor(7, 0);
			glBindBuffer(GL_ARRAY_BUFFER, 0);
			glBindBuffer(GL_DRAW_INDIRECT_BUFFER, 0);
			glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
		}