Framebuffer working; Trimap renders to FB; Refinem. use Trimap to Screen
This commit is contained in:
6
.gitignore
vendored
6
.gitignore
vendored
@@ -24,9 +24,9 @@
|
|||||||
#*.lib
|
#*.lib
|
||||||
|
|
||||||
# Executables
|
# Executables
|
||||||
#*.exe
|
*.exe
|
||||||
#*.out
|
*.out
|
||||||
#*.app
|
*.app
|
||||||
|
|
||||||
# ---> C
|
# ---> C
|
||||||
# Object files
|
# Object files
|
||||||
|
|||||||
Binary file not shown.
@@ -84,31 +84,62 @@ int main(int argc, char* args[]) {
|
|||||||
glBindBuffer(GL_ARRAY_BUFFER, colorbuffer);
|
glBindBuffer(GL_ARRAY_BUFFER, colorbuffer);
|
||||||
glBufferData(GL_ARRAY_BUFFER, sizeof(g_uv_buffer_data), g_uv_buffer_data, GL_STATIC_DRAW);
|
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);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
tex1 = LoadTexture("../img/tests/flieger.jpg",&textw,&texth);
|
tex1 = LoadTexture("../img/tests/flieger.jpg",&textw,&texth);
|
||||||
printf("Tex1: %d", tex1);
|
printf("Tex1: %d\n", tex1);
|
||||||
tex2 = LoadTexture("../img/tests/flieger2.jpg",&textw2,&texth2);
|
|
||||||
printf("Tex2: %d", tex2);
|
|
||||||
glfwSetWindowSize(window, textw, texth);
|
glfwSetWindowSize(window, textw, texth);
|
||||||
glViewport(0, 0, textw, texth);
|
glViewport(0, 0, textw, texth);
|
||||||
glfwSetWindowSizeLimits(window, textw, texth, textw, texth);
|
glfwSetWindowSizeLimits(window, textw, texth, textw, texth);
|
||||||
|
|
||||||
|
// 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_RGB, textw, texth, 0,GL_RGB, GL_UNSIGNED_BYTE, 0);
|
||||||
|
// Poor filtering. Needed !
|
||||||
|
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");
|
GLuint programID = LoadShaders("trimap.vertexshader", "trimap.fragmentshader");
|
||||||
|
GLuint programRefineID = LoadShaders("refinement.vertexshader", "refinement.fragmentshader");
|
||||||
GLint textureLoc1 = glGetUniformLocation(programID, "myTextureSampler");
|
GLint textureLoc1 = glGetUniformLocation(programID, "myTextureSampler");
|
||||||
GLint textureLoc2 = glGetUniformLocation(programID, "myTextureSampler2");
|
|
||||||
GLint widthLoc = glGetUniformLocation(programID, "pixWidth");
|
GLint widthLoc = glGetUniformLocation(programID, "pixWidth");
|
||||||
GLint heigthLoc = glGetUniformLocation(programID, "pixHeight");
|
GLint heigthLoc = glGetUniformLocation(programID, "pixHeight");
|
||||||
|
|
||||||
|
|
||||||
|
GLint textureLocTri = glGetUniformLocation(programRefineID, "trimap");
|
||||||
|
GLint textureLocFore = glGetUniformLocation(programRefineID, "foreground");
|
||||||
|
|
||||||
glActiveTexture(GL_TEXTURE0);
|
glActiveTexture(GL_TEXTURE0);
|
||||||
glBindTexture(GL_TEXTURE_2D, tex1);
|
glBindTexture(GL_TEXTURE_2D, tex1);
|
||||||
glActiveTexture(GL_TEXTURE1);
|
glActiveTexture(GL_TEXTURE2);
|
||||||
glBindTexture(GL_TEXTURE_2D, tex2);
|
glBindTexture(GL_TEXTURE_2D, renderedTexture);
|
||||||
|
|
||||||
|
|
||||||
printf("Shader program ID: %d\n", programID);
|
printf("Shader program ID: %d\n", programID);
|
||||||
printf("textureLoc1: %d\n", textureLoc1);
|
printf("textureLoc1: %d\n", textureLoc1);
|
||||||
printf("textureLoc2: %d\n", textureLoc2);
|
printf("textureLocTri: %d\n", textureLocTri);
|
||||||
|
//printf("textureLocFore: %d\n", textureLocFore);
|
||||||
printf("widthLoc: %d\n", widthLoc);
|
printf("widthLoc: %d\n", widthLoc);
|
||||||
printf("heigthLoc: %d\n", heigthLoc);
|
printf("heigthLoc: %d\n", heigthLoc);
|
||||||
printf("Width: %f\n", 1.0f/textw);
|
printf("Width: %f\n", 1.0f/textw);
|
||||||
@@ -120,13 +151,56 @@ int main(int argc, char* args[]) {
|
|||||||
/* Loop until the user closes the window */
|
/* Loop until the user closes the window */
|
||||||
while (!glfwWindowShouldClose(window)) {
|
while (!glfwWindowShouldClose(window)) {
|
||||||
/* Render here */
|
/* 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);
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
|
||||||
glUseProgram(programID);
|
glUseProgram(programID);
|
||||||
glUniform1f(widthLoc, 1.0f/textw);
|
glUniform1f(widthLoc, 1.0f/textw);
|
||||||
glUniform1f(heigthLoc, 1.0f/texth);
|
glUniform1f(heigthLoc, 1.0f/texth);
|
||||||
glUniform1i(textureLoc1, 0);
|
glUniform1i(textureLoc1, 0);
|
||||||
glUniform1i(textureLoc2, 1);
|
|
||||||
|
// 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(textureLocFore, 0);
|
||||||
|
|
||||||
|
|
||||||
// 1rst attribute buffer : vertices
|
// 1rst attribute buffer : vertices
|
||||||
glEnableVertexAttribArray(0);
|
glEnableVertexAttribArray(0);
|
||||||
|
|||||||
@@ -742,3 +742,13 @@
|
|||||||
<vector>
|
<vector>
|
||||||
"loaders.h"
|
"loaders.h"
|
||||||
|
|
||||||
|
1473669189 source:d:\owncloud\documents\programmierung\cpp\imanox-chroma-matting\opengl-test-two\src\loaders.cpp
|
||||||
|
<SDL2/SDL.h>
|
||||||
|
<SDL2/SDL_image.h>
|
||||||
|
<fstream>
|
||||||
|
<vector>
|
||||||
|
"loaders.h"
|
||||||
|
|
||||||
|
1473669189 d:\owncloud\documents\programmierung\cpp\imanox-chroma-matting\opengl-test-two\include\loaders.h
|
||||||
|
<GL/glew.h>
|
||||||
|
|
||||||
|
|||||||
46
opengl-test-two/refinement.fragmentshader
Normal file
46
opengl-test-two/refinement.fragmentshader
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
#version 330 core
|
||||||
|
|
||||||
|
// Interpolated values from the vertex shaders
|
||||||
|
in vec2 UV;
|
||||||
|
|
||||||
|
// Ouput data
|
||||||
|
out vec3 color;
|
||||||
|
|
||||||
|
// Values that stay constant for the whole mesh.
|
||||||
|
uniform sampler2D trimap;
|
||||||
|
uniform sampler2D foreground;
|
||||||
|
|
||||||
|
|
||||||
|
int IS_BACKGROUND = 0;
|
||||||
|
int IS_UNDEFINED = 1;
|
||||||
|
int IS_FOREGROUND = 2;
|
||||||
|
int UNSET = -1;
|
||||||
|
|
||||||
|
vec3 getTriColor(vec2 uvCoord) {
|
||||||
|
return texture(trimap, uvCoord).rgb;
|
||||||
|
}
|
||||||
|
|
||||||
|
vec3 getForeColor(vec2 uvCoord) {
|
||||||
|
return texture(foreground, uvCoord).rgb;
|
||||||
|
}
|
||||||
|
|
||||||
|
int getState(vec3 c) {
|
||||||
|
if (all(lessThanEqual(c, vec3(0.2f)))) {
|
||||||
|
return IS_BACKGROUND;
|
||||||
|
} else if (all(greaterThanEqual(c, vec3(0.8f)))) {
|
||||||
|
return IS_FOREGROUND;
|
||||||
|
} else {
|
||||||
|
return IS_UNDEFINED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void main(){
|
||||||
|
color = getTriColor(UV);
|
||||||
|
int status = getState(color);
|
||||||
|
|
||||||
|
|
||||||
|
if (status==IS_FOREGROUND) {
|
||||||
|
color = getForeColor(UV).rgb;
|
||||||
|
}
|
||||||
|
}
|
||||||
17
opengl-test-two/refinement.vertexshader
Normal file
17
opengl-test-two/refinement.vertexshader
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
#version 330 core
|
||||||
|
|
||||||
|
// Input vertex data, different for all executions of this shader.
|
||||||
|
layout(location = 0) in vec3 vertexPosition_modelspace;
|
||||||
|
layout(location = 1) in vec2 vertexUV;
|
||||||
|
|
||||||
|
// Output data ; will be interpolated for each fragment.
|
||||||
|
out vec2 UV;
|
||||||
|
|
||||||
|
void main(){
|
||||||
|
// Output position of the vertex, in clip space : MVP * position
|
||||||
|
gl_Position = vec4(vertexPosition_modelspace, 1);
|
||||||
|
|
||||||
|
// UV of the vertex. No special space for this one.
|
||||||
|
UV = vertexUV;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -4,11 +4,11 @@
|
|||||||
in vec2 UV;
|
in vec2 UV;
|
||||||
|
|
||||||
// Ouput data
|
// Ouput data
|
||||||
out vec3 color;
|
layout(location = 0) out vec3 color;
|
||||||
|
//out vec3 color;
|
||||||
|
|
||||||
// Values that stay constant for the whole mesh.
|
// Values that stay constant for the whole mesh.
|
||||||
uniform sampler2D myTextureSampler;
|
uniform sampler2D myTextureSampler;
|
||||||
uniform sampler2D myTextureSampler2;
|
|
||||||
|
|
||||||
// Relative width/height of a pixel
|
// Relative width/height of a pixel
|
||||||
uniform float pixWidth;
|
uniform float pixWidth;
|
||||||
@@ -23,7 +23,7 @@ int UNSET = -1;
|
|||||||
|
|
||||||
|
|
||||||
vec3 getColor(vec2 uvCoord) {
|
vec3 getColor(vec2 uvCoord) {
|
||||||
return texture(myTextureSampler2, uvCoord).rgb;
|
return texture(myTextureSampler, uvCoord).rgb;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isBackground(vec3 c) {
|
bool isBackground(vec3 c) {
|
||||||
@@ -70,10 +70,10 @@ void main(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (status == IS_BACKGROUND) {
|
if (status == IS_BACKGROUND) {
|
||||||
color = vec3(1.0f, 0.0f, 0.0f);
|
color = vec3(0.0f);
|
||||||
} else if (status == IS_FOREGROUND) {
|
} else if (status == IS_FOREGROUND) {
|
||||||
color = vec3(0.0f, 1.0f, 0.0f);
|
color = vec3(1.0f);
|
||||||
} else {
|
} else {
|
||||||
color = vec3(0.0f, 0.0f, 1.0f);
|
color = vec3(0.5f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ out vec2 UV;
|
|||||||
|
|
||||||
void main(){
|
void main(){
|
||||||
// Output position of the vertex, in clip space : MVP * position
|
// Output position of the vertex, in clip space : MVP * position
|
||||||
gl_Position = vec4(vertexPosition_modelspace, 1);
|
gl_Position = vec4(vertexPosition_modelspace.x, -1*vertexPosition_modelspace.y, vertexPosition_modelspace.z, 1);
|
||||||
|
|
||||||
// UV of the vertex. No special space for this one.
|
// UV of the vertex. No special space for this one.
|
||||||
UV = vertexUV;
|
UV = vertexUV;
|
||||||
|
|||||||
Reference in New Issue
Block a user