Created
June 2, 2014 14:55
-
-
Save hami9x/0ca9db956c8c0ca41cef to your computer and use it in GitHub Desktop.
fxaa c program
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <GL/glew.h> | |
#include <GLFW/glfw3.h> | |
#include <stdlib.h> | |
#include <stdio.h> | |
#include <fstream> | |
#include <unistd.h> | |
#include <iostream> | |
using namespace std; | |
static void error_callback(int error, const char* description) | |
{ | |
fputs(description, stderr); | |
} | |
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) | |
{ | |
if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) | |
glfwSetWindowShouldClose(window, GL_TRUE); | |
} | |
void printShaderLog( GLuint shader ) | |
{ | |
//Make sure name is shader | |
if( glIsShader( shader ) ) | |
{ | |
//Shader log length | |
int infoLogLength = 0; | |
int maxLength = infoLogLength; | |
//Get info string length | |
glGetShaderiv( shader, GL_INFO_LOG_LENGTH, &maxLength ); | |
//Allocate string | |
char* infoLog = new char[ maxLength ]; | |
//Get info log | |
glGetShaderInfoLog( shader, maxLength, &infoLogLength, infoLog ); | |
if( infoLogLength > 0 ) | |
{ | |
//Print Log | |
printf( "%s\n", infoLog ); | |
} | |
//Deallocate string | |
delete[] infoLog; | |
} | |
else | |
{ | |
printf( "Name %d is not a shader\n", shader ); | |
} | |
} | |
GLuint loadShaderFromFile( std::string path, GLenum shaderType ) | |
{ | |
//Open file | |
GLuint shaderID = 0; | |
std::string shaderString; | |
std::ifstream sourceFile( path.c_str() ); | |
//Source file loaded | |
if( sourceFile ) | |
{ | |
//Get shader source | |
shaderString.assign( ( std::istreambuf_iterator< char >( sourceFile ) ), std::istreambuf_iterator< char >() ); | |
//Create shader ID | |
shaderID = glCreateShader( shaderType ); | |
//Set shader source | |
const GLchar* shaderSource = shaderString.c_str(); | |
glShaderSource( shaderID, 1, (const GLchar**)&shaderSource, NULL ); | |
//Compile shader source | |
glCompileShader( shaderID ); | |
//Check shader for errors | |
GLint shaderCompiled = GL_FALSE; | |
glGetShaderiv( shaderID, GL_COMPILE_STATUS, &shaderCompiled ); | |
if( shaderCompiled != GL_TRUE ) | |
{ | |
printf( "Unable to compile shader %d!\n\nSource:\n%s\n", shaderID, shaderSource ); | |
printShaderLog( shaderID ); | |
glDeleteShader( shaderID ); | |
shaderID = 0; | |
} | |
} | |
else | |
{ | |
printf( "Unable to open file %s\n", path.c_str() ); | |
} | |
return shaderID; | |
} | |
int main(void) | |
{ | |
usleep(300*1000); | |
GLFWwindow* window; | |
glfwSetErrorCallback(error_callback); | |
if (!glfwInit()) | |
exit(EXIT_FAILURE); | |
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE); | |
window = glfwCreateWindow(640, 480, "Simple example", NULL, NULL); | |
if (!window) | |
{ | |
glfwTerminate(); | |
exit(EXIT_FAILURE); | |
} | |
glfwMakeContextCurrent(window); | |
glewExperimental = GL_TRUE; | |
GLenum err = glewInit(); | |
if (GLEW_OK != err) | |
{ | |
/* Problem: glewInit failed, something is seriously wrong. */ | |
fprintf(stderr, "Error: %s\n", glewGetErrorString(err)); | |
} | |
fprintf(stdout, "Status: Using GLEW %s\n", glewGetString(GLEW_VERSION)); | |
glfwSetKeyCallback(window, key_callback); | |
int width, height; | |
glfwGetFramebufferSize(window, &width, &height); | |
glViewport(0, 0, width, height); | |
glClear(GL_COLOR_BUFFER_BIT); | |
glMatrixMode (GL_PROJECTION); | |
glLoadIdentity (); | |
glOrtho (0, width, height, 0, 0, 1); | |
//glDisable(GL_DEPTH_TEST); | |
GLuint vao; | |
glGenVertexArrays(1, &vao); | |
glBindVertexArray(vao); | |
glClearColor(1, 1, 1, 1); | |
glClear(GL_COLOR_BUFFER_BIT); | |
// Create a Vertex Buffer Object and copy the vertex data to it | |
GLuint vbo; | |
glGenBuffers(1, &vbo); | |
GLfloat vertices[] = { | |
0.0f, 0.0f, 0.0f, 0.0f, | |
0.0f, -0.5f, 0.5f, 0.0f, | |
-0.8f, -0.5f, 1.0f, 1.0f | |
}; | |
glBindBuffer(GL_ARRAY_BUFFER, vbo); | |
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); | |
GLuint vertexShader = loadShaderFromFile("vshader.glsl", GL_VERTEX_SHADER); | |
GLuint fragmentShader = loadShaderFromFile("fshader.glsl", GL_FRAGMENT_SHADER); | |
GLuint shaderProgram = glCreateProgram(); | |
glAttachShader(shaderProgram, vertexShader); | |
glAttachShader(shaderProgram, fragmentShader); | |
glBindFragDataLocation(shaderProgram, 0, "outColor"); | |
glLinkProgram(shaderProgram); | |
glUseProgram(shaderProgram); | |
GLint posAttrib = glGetAttribLocation(shaderProgram, "position"); | |
glVertexAttribPointer(posAttrib, 2, GL_FLOAT, GL_FALSE, 4*sizeof(float), 0); | |
glEnableVertexAttribArray(posAttrib); | |
GLint texAttrib = glGetAttribLocation(shaderProgram, "texcoord"); | |
glVertexAttribPointer(texAttrib, 2, GL_FLOAT, GL_FALSE, 4*sizeof(float), (void*)(8)); | |
glEnableVertexAttribArray(texAttrib); | |
// glEnable(GL_STENCIL_TEST); | |
// glStencilFunc(GL_EQUAL, 0, 0xFF); | |
// Load textures | |
// The framebuffer, which regroups 0, 1, or more textures, and 0 or 1 depth buffer. | |
GLuint FramebufferName = 0; | |
glGenFramebuffers(1, &FramebufferName); | |
glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName); | |
// The texture we're going to render to | |
GLuint renderedTexture; | |
glGenTextures(1, &renderedTexture); | |
// "Bind" the newly created texture : all future texture functions will modify this texture | |
glBindTexture(GL_TEXTURE_2D, renderedTexture); | |
// Give an empty image to OpenGL ( the last "0" ) | |
glTexImage2D(GL_TEXTURE_2D, 0,GL_RGBA, 1024, 768, 0,GL_RGBA, GL_UNSIGNED_BYTE, 0); | |
// Poor filtering. Needed ! | |
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); | |
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); | |
// | |
// GLuint depthrenderbuffer; | |
// glGenRenderbuffers(1, &depthrenderbuffer); | |
// glBindRenderbuffer(GL_RENDERBUFFER, depthrenderbuffer); | |
// glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, 1024, 768); | |
// glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthrenderbuffer); | |
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, renderedTexture, 0); | |
// Set the list of draw buffers. | |
GLenum DrawBuffers[1] = {GL_COLOR_ATTACHMENT0}; | |
glDrawBuffers(1, DrawBuffers); // "1" is the size of DrawBuffers | |
if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { | |
printf(":-s %d", glCheckFramebufferStatus(GL_FRAMEBUFFER)); | |
exit(-1); | |
} | |
glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName); | |
glViewport(0,0,1024,768); // Render on the whole framebuffer, complete from the lower left corner to the upper right | |
glDrawArrays(GL_TRIANGLES, 0, 3); | |
glBindFramebuffer(GL_FRAMEBUFFER, 0); | |
// | |
float quad[] = | |
{ | |
-1.0f, 1.0f, 0.0f, 1.0f, // top left corner | |
-1.0f, -1.0f, 0.0f, 0.0f, // bottom left corner | |
1.0f, 1.0f, 1.0f, 1.0f,// top right corner | |
1.0f, -1.0f, 1.0f, 0.0f // bottom right corner | |
}; | |
GLuint quad_vertexbuffer; | |
glGenBuffers(1, &quad_vertexbuffer); | |
glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer); | |
glBufferData(GL_ARRAY_BUFFER, sizeof(quad), quad, GL_STATIC_DRAW); | |
glBindTexture(GL_TEXTURE_2D, renderedTexture); | |
vertexShader = loadShaderFromFile("vshader.glsl", GL_VERTEX_SHADER); | |
fragmentShader = loadShaderFromFile("fxaa.glsl", GL_FRAGMENT_SHADER); | |
shaderProgram = glCreateProgram(); | |
glAttachShader(shaderProgram, vertexShader); | |
glAttachShader(shaderProgram, fragmentShader); | |
glBindFragDataLocation(shaderProgram, 0, "outColor"); | |
glLinkProgram(shaderProgram); | |
glUseProgram(shaderProgram); | |
glBindFramebuffer(GL_FRAMEBUFFER, 0); | |
posAttrib = glGetAttribLocation(shaderProgram, "position"); | |
glVertexAttribPointer(posAttrib, 2, GL_FLOAT, GL_FALSE, 4*sizeof(float), 0); | |
glEnableVertexAttribArray(posAttrib); | |
texAttrib = glGetAttribLocation(shaderProgram, "texcoord"); | |
glVertexAttribPointer(texAttrib, 2, GL_FLOAT, GL_FALSE, 4*sizeof(float), (void*)(8)); | |
glEnableVertexAttribArray(texAttrib); | |
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); | |
glEnable( GL_BLEND ); | |
glDrawArrays(GL_TRIANGLES, 0, 3); | |
glDrawArrays(GL_TRIANGLES, 1, 3); | |
while (!glfwWindowShouldClose(window)) | |
{ | |
//Clear the screen to black | |
// Draw a triangle from the 3 vertices | |
glfwSwapBuffers(window); | |
glfwPollEvents(); | |
//draw(); | |
usleep(50*1000); | |
} | |
glfwDestroyWindow(window); | |
glfwTerminate(); | |
exit(EXIT_SUCCESS); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment