mix stage
This commit is contained in:
+25
-1
@@ -919,4 +919,28 @@ subroutine(fx_stage_sub) vec3 fx_2(vec2 vUV, sampler2D previous, sampler2D feedb
|
|||||||
// 7. mix
|
// 7. mix
|
||||||
// ----------
|
// ----------
|
||||||
|
|
||||||
// TODO
|
subroutine vec3 mix_stage_sub(vec2 vUV, sampler2D frame_a, sampler2D frame_b);
|
||||||
|
|
||||||
|
subroutine uniform mix_stage_sub mix_stage;
|
||||||
|
|
||||||
|
subroutine(mix_stage_sub) vec3 mix_0(vec2 vUV, sampler2D fa, sampler2D fb)
|
||||||
|
{
|
||||||
|
float v = 0.5;
|
||||||
|
|
||||||
|
vec3 color_a = texture(fa, vUV).xyz;
|
||||||
|
vec3 color_b = texture(fb, vUV).xyz;
|
||||||
|
|
||||||
|
return mix(color_b, color_a, v);
|
||||||
|
}
|
||||||
|
|
||||||
|
subroutine(mix_stage_sub) vec3 mix_1(vec2 vUV, sampler2D fa, sampler2D fb)
|
||||||
|
{
|
||||||
|
float v = 0.5;
|
||||||
|
|
||||||
|
vec3 color_a = texture(fa, vUV).xyz;
|
||||||
|
vec3 color_b = texture(fb, vUV).xyz;
|
||||||
|
|
||||||
|
float k = mean(color_a);
|
||||||
|
|
||||||
|
return mix(color_b, color_a, step(v, k));
|
||||||
|
}
|
||||||
+1
-2
@@ -8,6 +8,5 @@ in vec2 vUV;
|
|||||||
layout(location = 7) out vec3 fragColor;
|
layout(location = 7) out vec3 fragColor;
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
// TODO subroutine
|
fragColor = mix_stage(vUV, frame5, frame6);
|
||||||
fragColor = texture(frame5, vUV).xyz + texture(frame6, vUV).xyz;
|
|
||||||
}
|
}
|
||||||
+8
-8
@@ -151,19 +151,18 @@ void init_single_program(ShaderProgram *program, int i, bool output) {
|
|||||||
program->ires_locations[i] =
|
program->ires_locations[i] =
|
||||||
glGetUniformLocation(program->programs[i], "iResolution");
|
glGetUniformLocation(program->programs[i], "iResolution");
|
||||||
|
|
||||||
program->sub_src_locations[i] = glGetSubroutineUniformLocation(
|
|
||||||
program->programs[i], GL_FRAGMENT_SHADER, "src_stage");
|
|
||||||
program->sub_fx_locations[i] = glGetSubroutineUniformLocation(
|
|
||||||
program->programs[i], GL_FRAGMENT_SHADER, "fx_stage");
|
|
||||||
|
|
||||||
for (j = 0; j < SUB_COUNT; j++) {
|
for (j = 0; j < SUB_COUNT; j++) {
|
||||||
sprintf(name, "src_%d", j);
|
sprintf(name, "src_%d", j);
|
||||||
program->sub_src_indexes[i][j] =
|
program->sub_src_indexes[i][j] =
|
||||||
glGetSubroutineIndex(program->programs[i], GL_FRAGMENT_SHADER, name);
|
glGetSubroutineIndex(program->programs[i], GL_FRAGMENT_SHADER, name);
|
||||||
log_debug("%s %d", name, program->sub_src_indexes[i][j]);
|
|
||||||
sprintf(name, "fx_%d", j);
|
sprintf(name, "fx_%d", j);
|
||||||
program->sub_fx_indexes[i][j] =
|
program->sub_fx_indexes[i][j] =
|
||||||
glGetSubroutineIndex(program->programs[i], GL_FRAGMENT_SHADER, name);
|
glGetSubroutineIndex(program->programs[i], GL_FRAGMENT_SHADER, name);
|
||||||
|
if (j < 2) {
|
||||||
|
sprintf(name, "mix_%d", j);
|
||||||
|
program->sub_mix_indexes[i][j] = glGetSubroutineIndex(
|
||||||
|
program->programs[i], GL_FRAGMENT_SHADER, name);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -233,7 +232,7 @@ void update_program(ShaderProgram program, File *fragment_shaders, int i) {
|
|||||||
|
|
||||||
void apply_program(ShaderProgram program, Context context) {
|
void apply_program(ShaderProgram program, Context context) {
|
||||||
int i, j;
|
int i, j;
|
||||||
GLuint subroutines[2];
|
GLuint subroutines[3];
|
||||||
|
|
||||||
// viewport changed
|
// viewport changed
|
||||||
if (context.width != program.last_width ||
|
if (context.width != program.last_width ||
|
||||||
@@ -275,8 +274,9 @@ void apply_program(ShaderProgram program, Context context) {
|
|||||||
// TODO tmp
|
// TODO tmp
|
||||||
subroutines[0] = program.sub_src_indexes[i][i == 0 ? 1 : 2];
|
subroutines[0] = program.sub_src_indexes[i][i == 0 ? 1 : 2];
|
||||||
subroutines[1] = program.sub_fx_indexes[i][i == 2 ? 1 : 0];
|
subroutines[1] = program.sub_fx_indexes[i][i == 2 ? 1 : 0];
|
||||||
|
subroutines[2] = program.sub_mix_indexes[i][1];
|
||||||
|
|
||||||
glUniformSubroutinesuiv(GL_FRAGMENT_SHADER, 2, subroutines);
|
glUniformSubroutinesuiv(GL_FRAGMENT_SHADER, 3, subroutines);
|
||||||
}
|
}
|
||||||
|
|
||||||
// set GL_TEXTURE(X) to uniform sampler2D frameX
|
// set GL_TEXTURE(X) to uniform sampler2D frameX
|
||||||
|
|||||||
+1
-2
@@ -47,10 +47,9 @@ typedef struct ShaderProgram {
|
|||||||
|
|
||||||
GLuint frames_locations[FRAG_COUNT + 1][TEX_COUNT];
|
GLuint frames_locations[FRAG_COUNT + 1][TEX_COUNT];
|
||||||
|
|
||||||
GLuint sub_src_locations[FRAG_COUNT];
|
|
||||||
GLuint sub_src_indexes[FRAG_COUNT][SUB_COUNT];
|
GLuint sub_src_indexes[FRAG_COUNT][SUB_COUNT];
|
||||||
GLuint sub_fx_locations[FRAG_COUNT];
|
|
||||||
GLuint sub_fx_indexes[FRAG_COUNT][SUB_COUNT];
|
GLuint sub_fx_indexes[FRAG_COUNT][SUB_COUNT];
|
||||||
|
GLuint sub_mix_indexes[FRAG_COUNT][2];
|
||||||
|
|
||||||
GLuint vpos_locations[FRAG_COUNT + 1];
|
GLuint vpos_locations[FRAG_COUNT + 1];
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user