-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathframebuffershader.cpp
83 lines (65 loc) · 2.1 KB
/
framebuffershader.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
#include "framebuffershader.h"
static const float quadPositions[] =
{
-1.0f, 1.0f,
-1.0f, -1.0f,
1.0f, -1.0f,
-1.0f, 1.0f,
1.0f, -1.0f,
1.0f, 1.0f
};
static const float quadTexCoords[] =
{
0.0f, 1.0f,
0.0f, 0.0f,
1.0f, 0.0f,
0.0f, 1.0f,
1.0f, 0.0f,
1.0f, 1.0f
};
FramebufferShader::FramebufferShader(const string& fileName)
{
m_program = glCreateProgram();
m_shaders[0] = createShader(loadShader(fileName + ".vs"), GL_VERTEX_SHADER);
m_shaders[1] = createShader(loadShader(fileName + ".fs"), GL_FRAGMENT_SHADER);
for(unsigned i = 0; i < NUM_SHADERS; i++)
glAttachShader(m_program, m_shaders[i]);
glBindAttribLocation(m_program, 0, "position");
glBindAttribLocation(m_program, 1, "texCoord");
glLinkProgram(m_program);
checkShaderError(m_program, GL_LINK_STATUS, true, "Error: Program linking failed");
glValidateProgram(m_program);
checkShaderError(m_program, GL_VALIDATE_STATUS, true, "Error: Program is invalid");
initQuad();
}
FramebufferShader::~FramebufferShader()
{
for(unsigned i = 0; i < NUM_SHADERS; i++)
{
glDetachShader(m_program, m_shaders[i]);
glDeleteShader(m_shaders[i]);
}
glDeleteProgram(m_program);
glDeleteVertexArrays(1, &m_quadVao);
}
void FramebufferShader::update()
{
glBindVertexArray(m_quadVao);
glDrawArrays(GL_TRIANGLES, 0, m_quadDrawCount);
glBindVertexArray(0);
}
void FramebufferShader::initQuad()
{
glGenVertexArrays(1, &m_quadVao);
glBindVertexArray(m_quadVao);
glGenBuffers(NUM_QUAD_BUFFERS, m_quadBuffers);
glBindBuffer(GL_ARRAY_BUFFER, m_quadBuffers[QUAD_POSITION]);
glBufferData(GL_ARRAY_BUFFER, sizeof(quadPositions), &quadPositions[0], GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, m_quadBuffers[QUAD_TEXCOORD]);
glBufferData(GL_ARRAY_BUFFER, sizeof(quadTexCoords), &quadTexCoords[0], GL_STATIC_DRAW);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, 0);
glBindVertexArray(0);
}