diff --git a/.gitignore b/.gitignore index f0738af..4baaa00 100644 --- a/.gitignore +++ b/.gitignore @@ -24,9 +24,9 @@ #*.lib # Executables -#*.exe -#*.out -#*.app +*.exe +*.out +*.app # ---> C # Object files diff --git a/doku/OpenGL-Funktionsweise.svg b/doku/OpenGL-Funktionsweise.svg new file mode 100644 index 0000000..63fd150 --- /dev/null +++ b/doku/OpenGL-Funktionsweise.svg @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Lista + Display + + + Evaluación + + + Operaciones + por vértices + Ensamblado + de primitivas + + + Operaciones + de píxeles + + + Rasterización + + + Memoria + de + Texturas + + + Operaciones + por fragmentos + + + Frame + Buffer + + + + + Display + List + + + Evaluator + + + Per-Vertex + Operations + Primitive + Assembly + + + Pixel + Operations + + + Rasterization + + + Texture + Memory + + + Per-Fragment + Operations + + + Frame + Buffer + + + + \ No newline at end of file diff --git a/img/backgrounds/sky.jpg b/img/backgrounds/sky.jpg new file mode 100644 index 0000000..6272390 Binary files /dev/null and b/img/backgrounds/sky.jpg differ diff --git a/img/tests/flieger.jpg b/img/tests/flieger.jpg new file mode 100644 index 0000000..201e21b Binary files /dev/null and b/img/tests/flieger.jpg differ diff --git a/img/tests/flieger2.jpg b/img/tests/flieger2.jpg new file mode 100644 index 0000000..402cc26 Binary files /dev/null and b/img/tests/flieger2.jpg differ diff --git a/opengl-test-two/bin/Debug/opengl-test-two.exe b/opengl-test-two/bin/Debug/opengl-test-two.exe deleted file mode 100644 index 8603c2d..0000000 Binary files a/opengl-test-two/bin/Debug/opengl-test-two.exe and /dev/null differ diff --git a/opengl-test-two/include/loaders.h b/opengl-test-two/include/loaders.h new file mode 100644 index 0000000..257b499 --- /dev/null +++ b/opengl-test-two/include/loaders.h @@ -0,0 +1,10 @@ +#ifndef LOADERS_H +#define LOADERS_H + +#define GLEW_STATIC +#include + +int InitLoaders(); +GLuint LoadTexture(char *filename,int *textw,int *texth); +GLuint LoadShaders(const char * vertex_file_path,const char * fragment_file_path); +#endif // LOADERS_H diff --git a/opengl-test-two/main.cpp b/opengl-test-two/main.cpp index d884579..b2911a2 100644 --- a/opengl-test-two/main.cpp +++ b/opengl-test-two/main.cpp @@ -4,172 +4,15 @@ #include #include #include -#include -#include -#include #include -#include #include - -GLuint LoadTexture(char *filename,int *textw,int *texth) { - SDL_Surface *surface; - GLuint textureid; - int mode; - surface = IMG_Load(filename); - // Or if you don't use SDL_image you can use SDL_LoadBMP here instead: - // surface = SDL_LoadBMP(filename); - - // could not load filename - if (!surface) { - return 0; - } - - // work out what format to tell glTexImage2D to use... - if (surface->format->BytesPerPixel == 3) { // RGB 24bit - mode = GL_RGB; - - } else if (surface->format->BytesPerPixel == 4) { // RGBA 32bit - mode = GL_RGBA; - } else { - SDL_FreeSurface(surface); - return 0; - } - - *textw=surface->w; - *texth=surface->h; - // create one texture name - glGenTextures(1, &textureid); - // tell opengl to use the generated texture name - glBindTexture(GL_TEXTURE_2D, textureid); - // this reads from the sdl surface and puts it into an opengl texture - glTexImage2D(GL_TEXTURE_2D, 0, mode, surface->w, surface->h, 0, mode, GL_UNSIGNED_BYTE, surface->pixels); - // these affect how this texture is drawn later on...glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); - glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - // clean up - SDL_FreeSurface(surface); - return textureid; - -} - -void DrawTexture(int x, int y, GLuint textureid,int textw,int texth) { - //printf("x: %d\ty: %d\tw: %d\th: %d\n", x, y, textw, texth); - //int textw,texth; - // tell opengl to use the generated texture name - glBindTexture(GL_TEXTURE_2D, textureid); - glEnable(GL_TEXTURE_2D); - // make a rectangle - glBegin(GL_QUADS); - glTexCoord2d(0.0,0.0); glVertex2f(-1, -1); - glTexCoord2d(1.0,0.0); glVertex2f(1, -1); - glTexCoord2d(1.0,1.0); glVertex2f(1, 1); - glTexCoord2d(0.0,1.0); glVertex2f(-1, 1); - glEnd(); - glDisable(GL_TEXTURE_2D); -} - -GLuint LoadShaders(const char * vertex_file_path,const char * fragment_file_path){ - - // Create the shaders - GLuint VertexShaderID = glCreateShader(GL_VERTEX_SHADER); - GLuint FragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER); - - // Read the Vertex Shader code from the file - std::string VertexShaderCode; - std::ifstream VertexShaderStream(vertex_file_path, std::ios::in); - if(VertexShaderStream.is_open()){ - std::string Line = ""; - while(getline(VertexShaderStream, Line)) - VertexShaderCode += "\n" + Line; - VertexShaderStream.close(); - }else{ - printf("Impossible to open %s. Are you in the right directory ? Don't forget to read the FAQ !\n", vertex_file_path); - getchar(); - return 0; - } - - // Read the Fragment Shader code from the file - std::string FragmentShaderCode; - std::ifstream FragmentShaderStream(fragment_file_path, std::ios::in); - if(FragmentShaderStream.is_open()){ - std::string Line = ""; - while(getline(FragmentShaderStream, Line)) - FragmentShaderCode += "\n" + Line; - FragmentShaderStream.close(); - } - - GLint Result = GL_FALSE; - int InfoLogLength; - - - // Compile Vertex Shader - printf("Compiling shader : %s\n", vertex_file_path); - char const * VertexSourcePointer = VertexShaderCode.c_str(); - glShaderSource(VertexShaderID, 1, &VertexSourcePointer , NULL); - glCompileShader(VertexShaderID); - - // Check Vertex Shader - glGetShaderiv(VertexShaderID, GL_COMPILE_STATUS, &Result); - glGetShaderiv(VertexShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength); - if ( InfoLogLength > 0 ){ - std::vector VertexShaderErrorMessage(InfoLogLength+1); - glGetShaderInfoLog(VertexShaderID, InfoLogLength, NULL, &VertexShaderErrorMessage[0]); - printf("%s\n", &VertexShaderErrorMessage[0]); - } - - - - // Compile Fragment Shader - printf("Compiling shader : %s\n", fragment_file_path); - char const * FragmentSourcePointer = FragmentShaderCode.c_str(); - glShaderSource(FragmentShaderID, 1, &FragmentSourcePointer , NULL); - glCompileShader(FragmentShaderID); - - // Check Fragment Shader - glGetShaderiv(FragmentShaderID, GL_COMPILE_STATUS, &Result); - glGetShaderiv(FragmentShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength); - if ( InfoLogLength > 0 ){ - std::vector FragmentShaderErrorMessage(InfoLogLength+1); - glGetShaderInfoLog(FragmentShaderID, InfoLogLength, NULL, &FragmentShaderErrorMessage[0]); - printf("%s\n", &FragmentShaderErrorMessage[0]); - } - - - - // Link the program - printf("Linking program\n"); - GLuint ProgramID = glCreateProgram(); - glAttachShader(ProgramID, VertexShaderID); - glAttachShader(ProgramID, FragmentShaderID); - glLinkProgram(ProgramID); - - // Check the program - glGetProgramiv(ProgramID, GL_LINK_STATUS, &Result); - glGetProgramiv(ProgramID, GL_INFO_LOG_LENGTH, &InfoLogLength); - if ( InfoLogLength > 0 ){ - std::vector ProgramErrorMessage(InfoLogLength+1); - glGetProgramInfoLog(ProgramID, InfoLogLength, NULL, &ProgramErrorMessage[0]); - printf("%s\n", &ProgramErrorMessage[0]); - } - - - glDetachShader(ProgramID, VertexShaderID); - glDetachShader(ProgramID, FragmentShaderID); - - glDeleteShader(VertexShaderID); - glDeleteShader(FragmentShaderID); - - return ProgramID; -} - - +#include "loaders.h" int main(int argc, char* args[]) { GLFWwindow* window; - GLuint tex_jpe; + GLuint texFG, texBG; int textw, texth; + int textw2, texth2; /* Initialize the library */ @@ -194,25 +37,21 @@ int main(int argc, char* args[]) { GLenum error = glGetError(); if (error != GL_NO_ERROR) { - std::cout << "OpenGL Error: " << error << std::endl; + printf("OpenGL Error: %d",error); } GLenum glewinit = glewInit(); if (glewinit != GLEW_OK) { - std::cout << "Glew not okay! " << glewinit; + printf("Glew not okay! %d",glewinit); return 1; } /* SDL */ - if (SDL_Init(SDL_INIT_VIDEO) < 0) { + if (InitLoaders() < 0) { printf("SDL Error"); return 1; } // INIT - - GLuint VertexArrayID; - glGenVertexArrays(1, &VertexArrayID); - glBindVertexArray(VertexArrayID); // An array of 3 vectors which represents 3 vertices static const GLfloat g_vertex_buffer_data[] = { -1.0f, -1.0f, 0.0f, // (bottom - left ) TRIANGLE 1 @@ -245,22 +84,66 @@ int main(int argc, char* args[]) { glBindBuffer(GL_ARRAY_BUFFER, colorbuffer); glBufferData(GL_ARRAY_BUFFER, sizeof(g_uv_buffer_data), g_uv_buffer_data, GL_STATIC_DRAW); + // The framebuffer, which regroups 0, 1, or more textures, and 0 or 1 depth buffer. + GLuint FramebufferName; + glGenFramebuffers(1, &FramebufferName); + glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName); - tex_jpe = LoadTexture("../img/tests/test.png",&textw,&texth); - glfwSetWindowSize (window, textw, texth); + + + texBG = LoadTexture("../img/backgrounds/sky.jpg",&textw2,&texth2); + texFG = LoadTexture("../img/tests/flieger.jpg",&textw,&texth); + printf("Tex1: %d\n", texFG); + glfwSetWindowSize(window, textw, texth); glViewport(0, 0, textw, texth); glfwSetWindowSizeLimits(window, textw, texth, textw, texth); + // The texture we're going to render to + GLuint renderedTexture; + glGenTextures(1, &renderedTexture); + glBindTexture(GL_TEXTURE_2D, renderedTexture); + + glTexImage2D(GL_TEXTURE_2D, 0,GL_RGB, textw, texth, 0,GL_RGB, GL_UNSIGNED_BYTE, 0); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + + // Set "renderedTexture" as our colour attachement #2 + glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, renderedTexture, 0); + // Set the list of draw buffers. + GLenum DrawBuffers[1] = {GL_COLOR_ATTACHMENT2}; + glDrawBuffers(1, DrawBuffers); // "1" is the size of DrawBuffers + + // Always check that our framebuffer is ok + if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) + return false; + + GLuint programID = LoadShaders("trimap.vertexshader", "trimap.fragmentshader"); - GLint textureLocation = glGetUniformLocation(programID, "myTextureSampler"); - GLint widthLocation = glGetUniformLocation(programID, "pixWidth"); - GLint heigthLocation = glGetUniformLocation(programID, "pixHeight"); + GLuint programRefineID = LoadShaders("refinement.vertexshader", "refinement.fragmentshader"); + GLint textureLoc1 = glGetUniformLocation(programID, "myTextureSampler"); + GLint widthLoc = glGetUniformLocation(programID, "pixWidth"); + GLint heigthLoc = glGetUniformLocation(programID, "pixHeight"); + + + GLint textureLocTri = glGetUniformLocation(programRefineID, "trimap"); + GLint textureLocFore = glGetUniformLocation(programRefineID, "foreground"); + GLint textureLocBack = glGetUniformLocation(programRefineID, "background"); + + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, texFG); + glActiveTexture(GL_TEXTURE1); + glBindTexture(GL_TEXTURE_2D, texBG); + glActiveTexture(GL_TEXTURE2); + glBindTexture(GL_TEXTURE_2D, renderedTexture); + printf("Shader program ID: %d\n", programID); - printf("textureLocation: %d\n", textureLocation); - printf("widthLocation: %d\n", widthLocation); - printf("heigthLocation: %d\n", heigthLocation); + printf("textureLoc1: %d\n", textureLoc1); + printf("textureLocTri: %d\n", textureLocTri); + //printf("textureLocFore: %d\n", textureLocFore); + printf("widthLoc: %d\n", widthLoc); + printf("heigthLoc: %d\n", heigthLoc); printf("Width: %f\n", 1.0f/textw); printf("Height: %f\n", 1.0f/texth); @@ -270,11 +153,58 @@ int main(int argc, char* args[]) { /* Loop until the user closes the window */ while (!glfwWindowShouldClose(window)) { /* Render here */ + // Render to our framebuffer + glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName); + //glBindFramebuffer(GL_FRAMEBUFFER, 0); + //glViewport(0,0,textw,texth); // Render on the whole framebuffer, complete from the lower left corner to the upper right glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glUseProgram(programID); - glUniform1f(widthLocation, 1.0f/textw); - glUniform1f(heigthLocation, 1.0f/texth); + glUniform1f(widthLoc, 1.0f/textw); + glUniform1f(heigthLoc, 1.0f/texth); + glUniform1i(textureLoc1, 0); + + // 1rst attribute buffer : vertices + glEnableVertexAttribArray(0); + glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer); + glVertexAttribPointer( + 0, // attribute 0. No particular reason for 0, but must match the layout in the shader. + 3, // size + GL_FLOAT, // type + GL_FALSE, // normalized? + 0, // stride + (void*)0 // array buffer offset + ); + // 2nd attribute buffer : colors + glEnableVertexAttribArray(1); + glBindBuffer(GL_ARRAY_BUFFER, colorbuffer); + glVertexAttribPointer( + 1, // attribute. No particular reason for 1, but must match the layout in the shader. + 2, // size + GL_FLOAT, // type + GL_FALSE, // normalized? + 0, // stride + (void*)0 // array buffer offset + ); + + + // Draw the triangle ! + glDrawArrays(GL_TRIANGLES, 0, 2*3); // 2*3 indices starting at 0 -> 2 triangles -> 1 square + glDisableVertexAttribArray(0); + + + // Render to the screen + glUseProgram(0); + glBindFramebuffer(GL_FRAMEBUFFER, 0); + glViewport(0,0,textw, texth); // Render on the whole framebuffer, complete from the lower left corner to the upper right + + + glUseProgram(programRefineID); + glUniform1i(textureLocTri, 2); + glUniform1i(textureLocBack, 1); + glUniform1i(textureLocFore, 0); + + // 1rst attribute buffer : vertices glEnableVertexAttribArray(0); glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer); diff --git a/opengl-test-two/opengl-test-two.cbp b/opengl-test-two/opengl-test-two.cbp index 10a334b..9c101ae 100644 --- a/opengl-test-two/opengl-test-two.cbp +++ b/opengl-test-two/opengl-test-two.cbp @@ -13,6 +13,7 @@