aboutsummaryrefslogtreecommitdiff
path: root/KaplaDemo/samples/sampleViewer3/FXAAHelper.cpp
blob: cdb3d41d318e8fbc86a10de1ecf772f17a0f27ff (plain) (blame)
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);

}