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__); }
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(); }
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; }
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); }