#include "framebufferobject.h"FrameBufferObject::FrameBufferObject(){glGenFramebuffers(1, &mFrameBufferObject);}void FrameBufferObject::AttachColorBuffer(const char*bufferName,GLenum attachment, int width, int height, GLenum format){GLuint colorBuffer;glBindFramebuffer(GL_FRAMEBUFFER, mFrameBufferObject);glGenTextures(1, &colorBuffer);glBindTexture(GL_TEXTURE_2D, colorBuffer);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);glBindTexture(GL_TEXTURE_2D, 0);glFramebufferTexture2D(GL_FRAMEBUFFER, attachment, GL_TEXTURE_2D, colorBuffer, 0);mDrawBuffers.push_back(attachment);mBuffers.insert(std::pair<std::string,GLuint>(bufferName,colorBuffer));glBindFramebuffer(GL_FRAMEBUFFER, 0);}void FrameBufferObject::AttachDepthBuffer(const char*bufferName, int width, int height){GLuint depthMap;glBindFramebuffer(GL_FRAMEBUFFER, mFrameBufferObject);glGenTextures(1, &depthMap);glBindTexture(GL_TEXTURE_2D, depthMap);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, width, height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL);glBindTexture(GL_TEXTURE_2D, 0);glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depthMap, 0);mBuffers.insert(std::pair<std::string, GLuint>(bufferName, depthMap));glBindFramebuffer(GL_FRAMEBUFFER, 0);}void FrameBufferObject::Finish(){int nCount = (int)mDrawBuffers.size();if (nCount>0){GLenum *buffers = new GLenum[nCount];int i = 0;while (i<nCount){buffers[i] = mDrawBuffers[i];i++;}glBindFramebuffer(GL_FRAMEBUFFER, mFrameBufferObject);glDrawBuffers(nCount, buffers);glBindFramebuffer(GL_FRAMEBUFFER, 0);}}void FrameBufferObject::Bind(){glGetIntegerv(GL_FRAMEBUFFER_BINDING, &mPrevFrameBuffer);glBindFramebuffer(GL_FRAMEBUFFER, mFrameBufferObject);glClearColor(0.0f, 0.0f, 0.0f, 1.0f);glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);}void FrameBufferObject::Unbind(){glBindFramebuffer(GL_FRAMEBUFFER, mPrevFrameBuffer);}GLuint FrameBufferObject::GetBuffer(const char*bufferName){auto iter = mBuffers.find(bufferName);if (iter!=mBuffers.end()){return iter->second;}return 0;}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。