-
Notifications
You must be signed in to change notification settings - Fork 0
/
framebuffering.cpp
90 lines (69 loc) · 2.85 KB
/
framebuffering.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#pragma once
#ifndef FRAMEBUFFERINGCPP
#define FRAMEBUFFERINGCPP "BUFFERCPP"
#include "framebuffering.h"
FrameBuffer::FrameBuffer(int width, int height, GLenum scaleMode, Mesh &square)
{
Width = width;
Height = height;
ScalingMode = scaleMode;
mesh = square;
//mesh.texture = Texture(width, height, scaleMode);
glGenFramebuffers(1, &id);
glBindFramebuffer(GL_FRAMEBUFFER, id);
GLenum err;
while ((err = glGetError()) != GL_NO_ERROR)
{
std::cout << "ERROR::OPENGL:: Opengl errors going into the fb: " << err << '\n';
std::cout << "WH: " << width << ", " << height << '\n';
std::cout << "render texture index: " << texID << '\n';
}
glGenTextures(1, &texID);
glBindTexture(GL_TEXTURE_2D, texID);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, ScalingMode);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, ScalingMode);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texID, 0);
mesh.texture.id = texID;
glGenRenderbuffers(1, &DSrbo);
glBindRenderbuffer(GL_RENDERBUFFER, DSrbo);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, width, height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, DSrbo);
auto fbostatus = glCheckFramebufferStatus(GL_FRAMEBUFFER);
auto glerror = glGetError();
if (fbostatus != GL_FRAMEBUFFER_COMPLETE)
std::cout << "ERROR::FRAMEBUFFER:: Framebuffer is not complete! " << fbostatus << " " << glerror << '\n';
while ((err = glGetError()) != GL_NO_ERROR)
{
std::cout << "ERROR::OPENGL:: Opengl errors after the fb: " << err << " WH: " << width << ", " << height << '\n';
}
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glBindRenderbuffer(GL_RENDERBUFFER, 0);
}
FrameBuffer::FrameBuffer()
{
ScalingMode = GL_POINT;
mesh = Mesh();
mesh.texture = Texture();
}
void FrameBuffer::Resize(int width, int height)
{
Width = width;
Height = height;
glBindTexture(GL_TEXTURE_2D, texID);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mesh.texture.id, 0);
glBindRenderbuffer(GL_RENDERBUFFER, DSrbo);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, width, height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, DSrbo);
auto fbostatus = glCheckFramebufferStatus(GL_FRAMEBUFFER);
auto glerror = glGetError();
if (fbostatus != GL_FRAMEBUFFER_COMPLETE)
std::cout << "RESIZE ERROR::FRAMEBUFFER:: Framebuffer is not complete! " << fbostatus << " " << glerror << '\n';
}
void FrameBuffer::Use()
{
glBindFramebuffer(GL_FRAMEBUFFER, id);
glViewport(0, 0, Width, Height);
}
#endif // !FRAMEBUFFERINGCPP