Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- GBuffer::GBuffer() {
- }
- GBuffer::~GBuffer() {
- glDeleteTextures(2, &mTextures[0]);
- glDeleteTextures(1, &mDepthBuffer);
- glDeleteFramebuffers(1, &mFrameBuffer);
- }
- bool GBuffer::create(std::uint32_t width, std::uint32_t height) {
- mWidth = width;
- mHeight = height;
- mRenderState = RenderState(mWidth, mHeight);
- return initialize();
- }
- void GBuffer::readBind() {
- glBindFramebuffer(GL_FRAMEBUFFER, 0);
- glActiveTexture(GL_TEXTURE0);
- glBindTexture(GL_TEXTURE_2D, mTextures[TEX_DIFFUSE]);
- glActiveTexture(GL_TEXTURE1);
- glBindTexture(GL_TEXTURE_2D, mTextures[TEX_NORMALS]);
- }
- void GBuffer::readUnbind() {
- //glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
- }
- void GBuffer::writeBind(RenderContext *context) {
- glBindFramebuffer(GL_DRAW_FRAMEBUFFER, mFrameBuffer);
- context->push(&mRenderState);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- }
- void GBuffer::writeUnbind(RenderContext *context) {
- context->pop();
- glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
- }
- RenderState* GBuffer::state() {
- return &mRenderState;
- }
- bool GBuffer::initialize() {
- // Create textures
- glGenTextures(2, &mTextures[0]);
- glGenTextures(1, &mDepthBuffer);
- // Setup diffuse and normal maps
- for(int i = 0; i < 2; i++) {
- glBindTexture(GL_TEXTURE_2D, mTextures[0]);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, mWidth, mHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
- }
- // Setup depth buffer
- glBindTexture(GL_TEXTURE_2D, mDepthBuffer);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- glTexParameterf(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_INTENSITY);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE,
- GL_COMPARE_R_TO_TEXTURE);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, mWidth, mHeight, 0,
- GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, 0);
- glBindTexture(GL_TEXTURE_2D, 0);
- // Create the framebuffer
- glGenFramebuffers(1, &mFrameBuffer);
- glBindFramebuffer(GL_FRAMEBUFFER, mFrameBuffer);
- glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTextures[0],0);
- glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, mTextures[1],0);
- glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, mDepthBuffer, 0);
- GLenum attachments[] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1};
- glDrawBuffers(2, &attachments[0]);
- GLenum err = glCheckFramebufferStatus(GL_FRAMEBUFFER);
- if(err != GL_FRAMEBUFFER_COMPLETE) {
- LOG_ERROR(mLog, "Failed to create GBuffer: " + StringParser::intToString(err));
- return false;
- }
- glBindFramebuffer(GL_FRAMEBUFFER, 0);
- return true;
- }
Advertisement
Add Comment
Please, Sign In to add comment