- void ShaderBlurMeanFilter::init(void) {
- // Load texture from file
- loadTexture("TmpTex1.bmp", &tmpTex1);
- loadTexture("TmpTex2.bmp", &tmpTex2);
- std::string vertShaderSource;
- std::string fragShaderSource;
- const char* tmpVertShaderSource;
- const char* tmpFragShaderSource;
- GLint result = -1;
- GLenum status;
- /* ****** *
- * Pass 0 *
- * ****** */
- // Init vertex Shader
- vertShaderPass0 = glCreateShader(GL_VERTEX_SHADER);
- vertShaderSource = loadShader("Shader/Pass0.vert");
- tmpVertShaderSource = vertShaderSource.c_str();
- glShaderSourceARB(vertShaderPass0, 1, &tmpVertShaderSource, NULL);
- glCompileShaderARB(vertShaderPass0);
- result = -1;
- glGetShaderiv(vertShaderPass0, GL_COMPILE_STATUS, &result);
- if(GL_FALSE == result) {
- GLchar errorMessage[1024];
- glGetShaderInfoLog(vertShaderPass0, 1024, NULL, errorMessage);
- std::cout << "Can't compile vertex shader:" << errorMessage << std::endl;
- exit(-1);
- }
- // Init fragment Shader
- fragShaderPass0 = glCreateShader(GL_FRAGMENT_SHADER);
- fragShaderSource = loadShader("Shader/Pass0.frag");
- tmpFragShaderSource = fragShaderSource.c_str();
- glShaderSourceARB(fragShaderPass0, 1, &tmpFragShaderSource, NULL);
- glCompileShaderARB(fragShaderPass0);
- result = -1;
- glGetShaderiv(fragShaderPass0, GL_COMPILE_STATUS, &result);
- if(GL_FALSE == result) {
- GLchar errorMessage[1024];
- glGetShaderInfoLog(fragShaderPass0, 1024, NULL, errorMessage);
- std::cout << "Can't compile fragment shader:" << errorMessage << std::endl;
- exit(-1);
- }
- // Shader programm
- shaderProgramHandlePass0 = glCreateProgram();
- glAttachShader(shaderProgramHandlePass0, vertShaderPass0);
- glAttachShader(shaderProgramHandlePass0, fragShaderPass0);
- glLinkProgramARB(shaderProgramHandlePass0);
- //FBO
- glGenFramebuffersEXT(1, &fboPass0);
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboPass0);
- glGenRenderbuffersEXT(1, &fboDepthBufferPass0);
- glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, fboDepthBufferPass0);
- glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, 1024, 1024);
- glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, fboDepthBufferPass0);
- glGenTextures(1, &renderResultPass0);
- glBindTexture(GL_TEXTURE_2D, renderResultPass0);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1024, 1024, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
- glGenerateMipmapEXT(GL_TEXTURE_2D);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, renderResultPass0, 0);
- status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
- if(GL_FRAMEBUFFER_COMPLETE_EXT != status) {
- std::cout << "FBO Pass0 Error!" << std::endl;
- exit(-1);
- }
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
- }
- void ShaderBlurMeanFilter::renderToScreen(void) {
- int uniformLocation0 = -1;
- int uniformLocation1 = -1;
- // Set uniform variablen
- uniformLocation0 = glGetUniformLocationARB(shaderProgramHandlePass0, "tmpTex1");
- if(-1 == uniformLocation0) {
- std::cout << "Can't find tmpTex1 in Pass0" << std::endl;
- }
- glActiveTexture(GL_TEXTURE0);
- glBindTexture(GL_TEXTURE_2D, tmpTex1);
- glUniform1iARB(uniformLocation0, 0);
- uniformLocation1 = glGetUniformLocationARB(shaderProgramHandlePass0, "tmpTex2");
- if(-1 == uniformLocation1) {
- std::cout << "Can't find tmpTex2 in Pass0" << std::endl;
- }
- glActiveTexture(GL_TEXTURE1);
- glBindTexture(GL_TEXTURE_2D, tmpTex2);
- glUniform1iARB(uniformLocation1, 1);
- // Use shader
- glUseProgram(shaderProgramHandlePass0);
- // Render to fboPass0
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboPass0);
- glPushAttrib(GL_VIEWPORT_BIT);
- glViewport(0, 0, 1024, 1024);
- glBegin(GL_QUADS);
- glMultiTexCoord2f(GL_TEXTURE0, 0.0, 0.0);
- glMultiTexCoord2f(GL_TEXTURE1, 0.0, 0.0);
- glVertex2f(-1.7f, -1.7f);
- glMultiTexCoord2f(GL_TEXTURE0, 0.0, 1.0);
- glMultiTexCoord2f(GL_TEXTURE1, 0.0, 1.0);
- glVertex2f(-1.7f, 1.7f);
- glMultiTexCoord2f(GL_TEXTURE0, 1.0, 1.0);
- glMultiTexCoord2f(GL_TEXTURE1, 1.0, 1.0);
- glVertex2f(1.7f, 1.7f);
- glMultiTexCoord2f(GL_TEXTURE0, 1.0, 0.0);
- glMultiTexCoord2f(GL_TEXTURE1, 1.0, 0.0);
- glVertex2f(1.7f, -1.7f);
- glEnd();
- glPopAttrib();
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
- // Render to screen
- glUseProgram(NULL);
- glActiveTexture(GL_TEXTURE0);
- glBindTexture(GL_TEXTURE_2D, renderResultPass0);
- glEnable(GL_TEXTURE_2D);
- glBegin(GL_QUADS);
- glTexCoord2f(0.0, 0.0);
- glVertex2f(-1.7f, -1.7f);
- glTexCoord2f(0.0, 1.0);
- glVertex2f(-1.7f, 1.7f);
- glTexCoord2f(1.0, 1.0);
- glVertex2f(1.7f, 1.7f);
- glTexCoord2f(1.0, 0.0);
- glVertex2f(1.7f, -1.7f);
- glEnd();
- glDisable(GL_TEXTURE_2D);
- glBindTexture(GL_TEXTURE_2D, 0);
- }