- if( frag_shader ) {
- int variable;
- glUseProgram(frag_shader);
- if((variable = glGetUniformLocation(frag_shader, "tex")) >= 0)
- glUniform1i(variable, 0);
- if((variable = glGetUniformLocation(frag_shader, "tex1")) >= 0)
- glUniform1i(variable, 1);
- if((variable = glGetUniformLocation(frag_shader, "scale")) >= 0)
- glUniform1f(variable, scale);
+// in/out textures
+ fb_texture *in = new fb_texture(w, h, color_model);
+ in->bind(0);
+ in->read_screen(0,0, w,h);
+ fb_texture *out = new fb_texture(w, h, color_model);
+
+ unsigned int frag_shader =
+ VFrame::make_shader(0, in_vertex_frag, feather_frag, 0);
+ if( frag_shader > 0 ) {
+ GLuint points[1];
+ glGenBuffers(1, points);
+ for(int k = 0; k < total_submasks; k++) {
+ MaskEdge &edge = *edges[k];
+ if( !edge.size() ) continue;
+ if( !faders[k] ) continue;
+ if( !feathers[k] ) continue;
+ MaskSpots spots;
+ for( int i=0; i<edge.size(); ++i ) {
+ MaskCoord &a = edge[i];
+ MaskCoord &b = i<edge.size()-1 ? edge[i+1] : edge[0];
+ draw_spots(spots, a.x,a.y+h, b.x,b.y+h);
+ }
+ int sz = spots.size() * sizeof(MaskSpot);
+ glBindBufferRange(GL_SHADER_STORAGE_BUFFER, 0, points[0], 0, sz);
+ glBufferData(GL_SHADER_STORAGE_BUFFER, sz, &spots[0], GL_DYNAMIC_COPY);
+ glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
+ glUseProgram(frag_shader);
+ float r = feathers[k], v = faders[k];
+ glUniform1f(glGetUniformLocation(frag_shader, "r"), r);
+ glUniform1f(glGetUniformLocation(frag_shader, "v"), v);
+ in->bind(0);
+ glUniform1i(glGetUniformLocation(frag_shader, "tex"), 0);
+ out->set_output_texture();
+ glViewport(0,0, w,h);
+ out->draw_texture(0,0, w,h, 0,0, w,h);
+ glUseProgram(0);
+ fb_texture *t = in; in = out; out = t;
+ }
+ glDeleteBuffers(1, points);