From cfe964c06ee065185497648c19e952f3850a1a20 Mon Sep 17 00:00:00 2001 From: Jakob Progsch Date: Tue, 13 May 2014 16:46:45 +0200 Subject: [PATCH] changed sampler2D name --- 05fbo_fxaa.cpp | 200 ++++++++++++++++++++++++------------------------- 1 file changed, 100 insertions(+), 100 deletions(-) diff --git a/05fbo_fxaa.cpp b/05fbo_fxaa.cpp index 958c01f..f90b478 100644 --- a/05fbo_fxaa.cpp +++ b/05fbo_fxaa.cpp @@ -1,8 +1,8 @@ /* OpenGL example code - fbo & fxaa - * + * * render the cube from the perspective example to a texture and * apply fxaa antialiasing to it. - * + * * Autor: Jakob Progsch */ @@ -12,7 +12,7 @@ //glm is used to create perspective and transform matrices #include #include -#include +#include #include #include @@ -44,14 +44,14 @@ bool check_program_link_status(GLuint obj) { std::vector log(length); glGetProgramInfoLog(obj, length, &length, &log[0]); std::cerr << &log[0]; - return false; + return false; } return true; } int main() { int width = 640; int height = 480; - + if(glfwInit() == GL_FALSE) { std::cerr << "failed to init GLFW" << std::endl; return 1; @@ -61,7 +61,7 @@ int main() { glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); - + // create a window GLFWwindow *window; if((window = glfwCreateWindow(width, height, "05fbo_fxaa", 0, 0)) == 0) { @@ -69,7 +69,7 @@ int main() { glfwTerminate(); return 1; } - + glfwMakeContextCurrent(window); if(glxwInit()) { @@ -78,7 +78,7 @@ int main() { glfwTerminate(); return 1; } - + // shader source code std::string vertex_source = "#version 330\n" @@ -90,7 +90,7 @@ int main() { " fcolor = vcolor;\n" " gl_Position = ViewProjection*vposition;\n" "}\n"; - + std::string fragment_source = "#version 330\n" "in vec4 fcolor;\n" @@ -100,11 +100,11 @@ int main() { // the following line is required for fxaa (will not work with blending!) " FragColor.a = dot(fcolor.rgb, vec3(0.299, 0.587, 0.114));\n" "}\n"; - + // program and shader handles GLuint shader_program, vertex_shader, fragment_shader; - - + + // we need these to properly pass the strings const char *source; int length; @@ -113,52 +113,52 @@ int main() { vertex_shader = glCreateShader(GL_VERTEX_SHADER); source = vertex_source.c_str(); length = vertex_source.size(); - glShaderSource(vertex_shader, 1, &source, &length); + glShaderSource(vertex_shader, 1, &source, &length); glCompileShader(vertex_shader); if(!check_shader_compile_status(vertex_shader)) { glfwDestroyWindow(window); glfwTerminate(); return 1; } - + // create and compiler fragment shader fragment_shader = glCreateShader(GL_FRAGMENT_SHADER); source = fragment_source.c_str(); length = fragment_source.size(); - glShaderSource(fragment_shader, 1, &source, &length); + glShaderSource(fragment_shader, 1, &source, &length); glCompileShader(fragment_shader); if(!check_shader_compile_status(fragment_shader)) { glfwDestroyWindow(window); glfwTerminate(); return 1; } - + // create program shader_program = glCreateProgram(); - + // attach shaders glAttachShader(shader_program, vertex_shader); glAttachShader(shader_program, fragment_shader); - + // link the program and check for errors glLinkProgram(shader_program); check_program_link_status(shader_program); - + // obtain location of projection uniform GLint ViewProjection_location = glGetUniformLocation(shader_program, "ViewProjection"); - - + + // vao and vbo handle GLuint vao, vbo, ibo; - + // generate and bind the vao glGenVertexArrays(1, &vao); glBindVertexArray(vao); - + // generate and bind the vertex buffer object glGenBuffers(1, &vbo); glBindBuffer(GL_ARRAY_BUFFER, vbo); - + // data for a cube GLfloat vertexData[] = { // X Y Z R G B @@ -179,7 +179,7 @@ int main() { 1.0f, 1.0f,-1.0f, 0.0f, 0.0f, 1.0f, // vertex 1 -1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, // vertex 2 -1.0f, 1.0f,-1.0f, 0.0f, 0.0f, 1.0f, // vertex 3 - + // face 3: 1.0f, 1.0f,-1.0f, 1.0f, 1.0f, 0.0f, // vertex 0 1.0f,-1.0f,-1.0f, 1.0f, 1.0f, 0.0f, // vertex 1 @@ -201,20 +201,20 @@ int main() { // fill with data glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*6*4*6, vertexData, GL_STATIC_DRAW); - - + + // set up generic attrib pointers glEnableVertexAttribArray(0); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6*sizeof(GLfloat), (char*)0 + 0*sizeof(GLfloat)); - + glEnableVertexAttribArray(1); glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6*sizeof(GLfloat), (char*)0 + 3*sizeof(GLfloat)); - - + + // generate and bind the index buffer object glGenBuffers(1, &ibo); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo); - + GLuint indexData[] = { // face 0: 0,1,2, // first triangle @@ -238,10 +238,10 @@ int main() { // fill with data glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLuint)*6*2*3, indexData, GL_STATIC_DRAW); - + // "unbind" vao glBindVertexArray(0); - + // shader source code std::string post_effect_vertex_source = "#version 330\n" @@ -252,7 +252,7 @@ int main() { " ftexcoord = vtexcoord;\n" " gl_Position = vposition;\n" "}\n"; - + // this is a Timothy Lottes FXAA 3.11 // check out the following link for detailed information: // http://timothylottes.blogspot.ch/2011/07/fxaa-311-released.html @@ -263,10 +263,10 @@ int main() { // #define FXAA_PC 1 // #define FXAA_GLSL_130 1 // #define FXAA_QUALITY__PRESET 13 - + std::string post_effect_fragment_source = "#version 330\n" - "uniform sampler2D texture;\n" + "uniform sampler2D intexture;\n" "in vec2 ftexcoord;\n" "layout(location = 0) out vec4 FragColor;\n" "\n" @@ -456,14 +456,14 @@ int main() { "void main() { \n" " FragColor = FxaaPixelShader(\n" " ftexcoord,\n" - " texture,\n" - " 1.0/textureSize(texture,0),\n" + " intexture,\n" + " 1.0/textureSize(intexture,0),\n" " 0.75,\n" " 0.166,\n" " 0.0625\n" " );\n" "}\n"; - + // program and shader handles GLuint post_effect_shader_program, post_effect_vertex_shader, post_effect_fragment_shader; @@ -471,52 +471,52 @@ int main() { post_effect_vertex_shader = glCreateShader(GL_VERTEX_SHADER); source = post_effect_vertex_source.c_str(); length = post_effect_vertex_source.size(); - glShaderSource(post_effect_vertex_shader, 1, &source, &length); + glShaderSource(post_effect_vertex_shader, 1, &source, &length); glCompileShader(post_effect_vertex_shader); if(!check_shader_compile_status(post_effect_vertex_shader)) { return 1; } - + // create and compiler fragment shader post_effect_fragment_shader = glCreateShader(GL_FRAGMENT_SHADER); source = post_effect_fragment_source.c_str(); length = post_effect_fragment_source.size(); - glShaderSource(post_effect_fragment_shader, 1, &source, &length); + glShaderSource(post_effect_fragment_shader, 1, &source, &length); glCompileShader(post_effect_fragment_shader); if(!check_shader_compile_status(post_effect_fragment_shader)) { return 1; } - + // create program post_effect_shader_program = glCreateProgram(); - + // attach shaders glAttachShader(post_effect_shader_program, post_effect_vertex_shader); glAttachShader(post_effect_shader_program, post_effect_fragment_shader); - + // link the program and check for errors glLinkProgram(post_effect_shader_program); check_program_link_status(post_effect_shader_program); - + // get texture uniform location - GLint post_effect_texture_location = glGetUniformLocation(post_effect_shader_program, "texture"); - + GLint post_effect_texture_location = glGetUniformLocation(post_effect_shader_program, "intexture"); + // vao and vbo handle GLuint post_effect_vao, post_effect_vbo, post_effect_ibo; - + // generate and bind the vao glGenVertexArrays(1, &post_effect_vao); glBindVertexArray(post_effect_vao); - + // generate and bind the vertex buffer object glGenBuffers(1, &post_effect_vbo); glBindBuffer(GL_ARRAY_BUFFER, post_effect_vbo); - + // data for a fullscreen quad (this time with texture coords) GLfloat post_effect_vertexData[] = { - // X Y Z U V + // X Y Z U V 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, // vertex 0 -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, // vertex 1 1.0f,-1.0f, 0.0f, 1.0f, 0.0f, // vertex 2 @@ -525,20 +525,20 @@ int main() { // fill with data glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*4*5, post_effect_vertexData, GL_STATIC_DRAW); - - + + // set up generic attrib pointers glEnableVertexAttribArray(0); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5*sizeof(GLfloat), (char*)0 + 0*sizeof(GLfloat)); - + glEnableVertexAttribArray(1); glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5*sizeof(GLfloat), (char*)0 + 3*sizeof(GLfloat)); - - + + // generate and bind the index buffer object glGenBuffers(1, &post_effect_ibo); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, post_effect_ibo); - + GLuint post_effect_indexData[] = { 0,1,2, // first triangle 2,1,3, // second triangle @@ -546,153 +546,153 @@ int main() { // fill with data glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLuint)*2*3, post_effect_indexData, GL_STATIC_DRAW); - + // "unbind" vao glBindVertexArray(0); - + // texture handle GLuint texture; - + // generate texture glGenTextures(1, &texture); // bind the texture glBindTexture(GL_TEXTURE_2D, texture); - + // set texture parameters 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_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - + // set texture content glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); // renderbuffer handle GLuint rbf; - + // generate renderbuffers glGenRenderbuffers(1, &rbf); - + glBindRenderbuffer(GL_RENDERBUFFER, rbf); glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, width, height); // framebuffer handle GLuint fbo; - + // generate framebuffer glGenFramebuffers(1, &fbo); glBindFramebuffer(GL_FRAMEBUFFER, fbo); - + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rbf); - - + + bool fxaa = true; - bool space_down = false; + bool space_down = false; while(!glfwWindowShouldClose(window)) { glfwPollEvents(); // get the time in seconds float t = glfwGetTime(); - + // toggle fxaa on/off with space if(glfwGetKey(window, GLFW_KEY_SPACE) && !space_down) { fxaa = !fxaa; } space_down = glfwGetKey(window, GLFW_KEY_SPACE); - + glEnable(GL_DEPTH_TEST); - + // bind target framebuffer if(fxaa) glBindFramebuffer(GL_FRAMEBUFFER, fbo); else glBindFramebuffer(GL_FRAMEBUFFER, 0); - + // clear first glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - + // use the shader program glUseProgram(shader_program); - + // calculate ViewProjection matrix glm::mat4 Projection = glm::perspective(90.0f, 4.0f / 3.0f, 0.1f, 100.f); - + // translate the world/view position glm::mat4 View = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, -5.0f)); - + // make the camera rotate around the origin - View = glm::rotate(View, 90.0f*t, glm::vec3(1.0f, 1.0f, 1.0f)); - + View = glm::rotate(View, 90.0f*t, glm::vec3(1.0f, 1.0f, 1.0f)); + glm::mat4 ViewProjection = Projection*View; - + // set the uniform - glUniformMatrix4fv(ViewProjection_location, 1, GL_FALSE, glm::value_ptr(ViewProjection)); - + glUniformMatrix4fv(ViewProjection_location, 1, GL_FALSE, glm::value_ptr(ViewProjection)); + // bind the vao glBindVertexArray(vao); // draw glDrawElements(GL_TRIANGLES, 6*6, GL_UNSIGNED_INT, 0); - + // apply post processing only when fxaa is on if(fxaa) { // bind the "screen frambuffer" glBindFramebuffer(GL_FRAMEBUFFER, 0); - + // we are not 3d rendering so no depth test glDisable(GL_DEPTH_TEST); - + // use the shader program glUseProgram(post_effect_shader_program); - + // bind texture to texture unit 0 glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, texture); - + // set uniforms glUniform1i(post_effect_texture_location, 0); - + // bind the vao glBindVertexArray(post_effect_vao); // draw glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); - } - + } + // check for errors GLenum error = glGetError(); if(error != GL_NO_ERROR) { std::cerr << error << std::endl; break; } - + // finally swap buffers - glfwSwapBuffers(window); + glfwSwapBuffers(window); } - + // delete the created objects - + glDeleteVertexArrays(1, &vao); glDeleteBuffers(1, &vbo); glDeleteBuffers(1, &ibo); - - glDetachShader(shader_program, vertex_shader); + + glDetachShader(shader_program, vertex_shader); glDetachShader(shader_program, fragment_shader); glDeleteShader(vertex_shader); glDeleteShader(fragment_shader); glDeleteProgram(shader_program); - + glDeleteVertexArrays(1, &post_effect_vao); glDeleteBuffers(1, &post_effect_vbo); glDeleteBuffers(1, &post_effect_ibo); - - glDetachShader(post_effect_shader_program, post_effect_vertex_shader); + + glDetachShader(post_effect_shader_program, post_effect_vertex_shader); glDetachShader(post_effect_shader_program, post_effect_fragment_shader); glDeleteShader(post_effect_vertex_shader); glDeleteShader(post_effect_fragment_shader);