-
Notifications
You must be signed in to change notification settings - Fork 47
/
GLSLDepthFillAlphaProgram.cpp
89 lines (62 loc) · 2.08 KB
/
GLSLDepthFillAlphaProgram.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
#include "GLSLDepthFillAlphaProgram.h"
#include "GLProgramAttributes.h"
#include "../GLProgramFactory.h"
#include "debugging/gl.h"
#include "itextstream.h"
namespace render
{
namespace
{
const char* DEPTHFILL_ALPHA_VP_FILENAME = "zfill_vp.glsl"; // use the same VP
const char* DEPTHFILL_ALPHA_FP_FILENAME = "zfill_alpha_fp.glsl";
}
void GLSLDepthFillAlphaProgram::create()
{
// Create the program object
rMessage() << "[renderer] Creating GLSL depthfill+alpha program" << std::endl;
_programObj = GLProgramFactory::createGLSLProgram(
DEPTHFILL_ALPHA_VP_FILENAME, DEPTHFILL_ALPHA_FP_FILENAME
);
glBindAttribLocation(_programObj, GLProgramAttribute::TexCoord, "attr_TexCoord0");
glLinkProgram(_programObj);
debug::assertNoGlErrors();
_locAlphaTest = glGetUniformLocation(_programObj, "u_alphaTest");
_locObjectTransform = glGetUniformLocation(_programObj, "u_objectTransform");
glUseProgram(_programObj);
debug::assertNoGlErrors();
GLint samplerLoc = glGetUniformLocation(_programObj, "u_diffuse");
glUniform1i(samplerLoc, 0);
debug::assertNoGlErrors();
}
void GLSLDepthFillAlphaProgram::enable()
{
GLSLProgramBase::enable();
glEnableVertexAttribArray(GLProgramAttribute::Position);
glEnableVertexAttribArray(GLProgramAttribute::TexCoord);
}
void GLSLDepthFillAlphaProgram::disable()
{
GLSLProgramBase::disable();
glDisableVertexAttribArray(GLProgramAttribute::Position);
glDisableVertexAttribArray(GLProgramAttribute::TexCoord);
}
void GLSLDepthFillAlphaProgram::applyAlphaTest(float alphaTest)
{
glUniform1f(_locAlphaTest, alphaTest);
debug::assertNoGlErrors();
glActiveTexture(GL_TEXTURE0);
glClientActiveTexture(GL_TEXTURE0);
glMatrixMode(GL_TEXTURE);
glLoadIdentity();
debug::assertNoGlErrors();
}
void GLSLDepthFillAlphaProgram::setObjectTransform(const Matrix4& transform)
{
float values[16];
for (auto i = 0; i < 16; ++i)
{
values[i] = static_cast<float>(transform[i]);
}
glUniformMatrix4fv(_locObjectTransform, 1, GL_FALSE, values);
}
}