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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
|
#include "FXAAHelper.h"
#include "foundation/PxMat44.h"
const char *computeLumaVS = STRINGIFY(
void main(void)
{
gl_TexCoord[0] = gl_MultiTexCoord0;
gl_Position = gl_Vertex * 2.0 - 1.0;
}
);
const char *computeLumaFS = STRINGIFY(
uniform sampler2D imgTex;
void main (void)
{
vec4 col = texture2D(imgTex,gl_TexCoord[0].xy);
gl_FragColor = vec4(col.xyz, sqrt(dot(col.rgb, vec3(0.299, 0.587, 0.114))));
}
);
FXAAHelper::FXAAHelper( const char* resourcePath) {
char fxaaVSF[5000];
char fxaaFSF[5000];
sprintf(fxaaVSF, "%s\\fxaa.vs", resourcePath);
sprintf(fxaaFSF, "%s\\fxaa.fs", resourcePath);
computeLuma.loadShaderCode(computeLumaVS,computeLumaFS);
fxaa.loadShaders(fxaaVSF,fxaaFSF);
glUseProgram(computeLuma);
glUniform1i(glGetUniformLocation(computeLuma,"imgTex"),0);
glUseProgram(0);
glUseProgram(fxaa);
glUniform1i(glGetUniformLocation(fxaa,"imgWithLumaTex"),0);
glUseProgram(0);
glGenTextures(1,&imgTex);
glGenTextures(1,&imgWithLumaTex);
glGenTextures(1,&depthTex);
glGenFramebuffers(1,&FBO);
}
void FXAAHelper::Resize(int w,int h) {
Width = w;
Height = h;
glViewport(0,0,Width,Height);
glBindTexture(GL_TEXTURE_2D,imgTex);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA8,Width,Height,0,GL_RGBA,GL_UNSIGNED_BYTE,NULL);
glBindTexture(GL_TEXTURE_2D,imgWithLumaTex);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA8,Width,Height,0,GL_RGBA,GL_UNSIGNED_BYTE,NULL);
glBindTexture(GL_TEXTURE_2D,depthTex);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP);
glTexImage2D(GL_TEXTURE_2D,0,GL_DEPTH_COMPONENT32,Width,Height,0,GL_DEPTH_COMPONENT,GL_FLOAT,NULL);
glUseProgram(fxaa);
glUniform2f(glGetUniformLocation(fxaa,"rcpFrame"), 1.0f / ((float)Width), 1.0f / ((float)Height));
glUseProgram(0);
}
void FXAAHelper::Destroy() {
computeLuma.deleteShaders();
fxaa.deleteShaders();
glDeleteTextures(1,&imgTex);
glDeleteTextures(1,&imgWithLumaTex);
glDeleteTextures(1,&depthTex);
glDeleteFramebuffers(1,&FBO);
}
void FXAAHelper::StartFXAA() {
glBindFramebuffer(GL_FRAMEBUFFER,FBO);
glFramebufferTexture2D(GL_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,GL_TEXTURE_2D,imgTex,0);
glFramebufferTexture2D(GL_FRAMEBUFFER,GL_DEPTH_ATTACHMENT,GL_TEXTURE_2D,depthTex,0);
glViewport(0,0,Width,Height);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}
void FXAAHelper::EndFXAA(GLuint oldFBO) {
glDisable(GL_CULL_FACE);
glDisable(GL_DEPTH_TEST);
glDepthMask(GL_FALSE);
// if(Blur)
// {
glBindFramebuffer(GL_FRAMEBUFFER,FBO);
glFramebufferTexture2D(GL_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,GL_TEXTURE_2D,imgWithLumaTex,0);
glFramebufferTexture2D(GL_FRAMEBUFFER,GL_DEPTH_ATTACHMENT,GL_TEXTURE_2D,0,0);
glClearColor(0.0f,0.0f,0.0f,0.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D,imgTex);
glUseProgram(computeLuma);
glBegin(GL_QUADS);
glTexCoord2f(0.0f,0.0f); glVertex2f(0.0f,0.0f);
glTexCoord2f(1.0f,0.0f); glVertex2f(1.0f,0.0f);
glTexCoord2f(1.0f,1.0f); glVertex2f(1.0f,1.0f);
glTexCoord2f(0.0f,1.0f); glVertex2f(0.0f,1.0f);
glEnd();
glUseProgram(0);
glBindFramebuffer(GL_FRAMEBUFFER,oldFBO);
glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D,imgWithLumaTex);
glUseProgram(fxaa);
glBegin(GL_QUADS);
glTexCoord2f(0.0f,0.0f); glVertex2f(0.0f,0.0f);
glTexCoord2f(1.0f,0.0f); glVertex2f(1.0f,0.0f);
glTexCoord2f(1.0f,1.0f); glVertex2f(1.0f,1.0f);
glTexCoord2f(0.0f,1.0f); glVertex2f(0.0f,1.0f);
glEnd();
glUseProgram(0);
glBindTexture(GL_TEXTURE_2D,0);
glDepthMask(GL_TRUE);
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
}
|