示例#1
0
static void find_uniforms(glsl_shader_data_t *glsl,
                          unsigned pass, GLuint prog,
                          struct shader_uniforms *uni)
{
    unsigned i;
    char frame_base[64] = {0};

    glUseProgram(prog);

    uni->mvp           = get_uniform(glsl, prog, "MVPMatrix");
    uni->tex_coord     = get_attrib(glsl, prog, "TexCoord");
    uni->vertex_coord  = get_attrib(glsl, prog, "VertexCoord");
    uni->color         = get_attrib(glsl, prog, "Color");
    uni->lut_tex_coord = get_attrib(glsl, prog, "LUTTexCoord");

    uni->input_size    = get_uniform(glsl, prog, "InputSize");
    uni->output_size   = get_uniform(glsl, prog, "OutputSize");
    uni->texture_size  = get_uniform(glsl, prog, "TextureSize");

    uni->frame_count     = get_uniform(glsl, prog, "FrameCount");
    uni->frame_direction = get_uniform(glsl, prog, "FrameDirection");

    for (i = 0; i < glsl->shader->luts; i++)
        uni->lut_texture[i] = glGetUniformLocation(prog, glsl->shader->lut[i].id);

    clear_uniforms_frame(&uni->orig);
    find_uniforms_frame(glsl, prog, &uni->orig, "Orig");
    clear_uniforms_frame(&uni->feedback);
    find_uniforms_frame(glsl, prog, &uni->feedback, "Feedback");

    if (pass > 1)
    {
        snprintf(frame_base, sizeof(frame_base), "PassPrev%u", pass);
        find_uniforms_frame(glsl, prog, &uni->orig, frame_base);
    }

    for (i = 0; i + 1 < pass; i++)
    {
        snprintf(frame_base, sizeof(frame_base), "Pass%u", i + 1);
        clear_uniforms_frame(&uni->pass[i]);
        find_uniforms_frame(glsl, prog, &uni->pass[i], frame_base);
        snprintf(frame_base, sizeof(frame_base), "PassPrev%u", pass - (i + 1));
        find_uniforms_frame(glsl, prog, &uni->pass[i], frame_base);

        if (*glsl->shader->pass[i].alias)
            find_uniforms_frame(glsl, prog, &uni->pass[i], glsl->shader->pass[i].alias);
    }

    clear_uniforms_frame(&uni->prev[0]);
    find_uniforms_frame(glsl, prog, &uni->prev[0], "Prev");
    for (i = 1; i < PREV_TEXTURES; i++)
    {
        snprintf(frame_base, sizeof(frame_base), "Prev%u", i);
        clear_uniforms_frame(&uni->prev[i]);
        find_uniforms_frame(glsl, prog, &uni->prev[i], frame_base);
    }

    glUseProgram(0);
}
示例#2
0
static void find_uniforms(unsigned pass, GLuint prog, struct shader_uniforms *uni)
{
   glUseProgram(prog);

   uni->mvp           = get_uniform(prog, "MVPMatrix");
   uni->tex_coord     = get_attrib(prog, "TexCoord");
   uni->vertex_coord  = get_attrib(prog, "VertexCoord");
   uni->color         = get_attrib(prog, "Color");
   uni->lut_tex_coord = get_attrib(prog, "LUTTexCoord");

   uni->input_size    = get_uniform(prog, "InputSize");
   uni->output_size   = get_uniform(prog, "OutputSize");
   uni->texture_size  = get_uniform(prog, "TextureSize");

   uni->frame_count     = get_uniform(prog, "FrameCount");
   uni->frame_direction = get_uniform(prog, "FrameDirection");

   for (unsigned i = 0; i < glsl_shader->luts; i++)
      uni->lut_texture[i] = glGetUniformLocation(prog, glsl_shader->lut[i].id);

   char frame_base[64];
   clear_uniforms_frame(&uni->orig);
   find_uniforms_frame(prog, &uni->orig, "Orig");
   if (pass > 1)
   {
      snprintf(frame_base, sizeof(frame_base), "PassPrev%u", pass);
      find_uniforms_frame(prog, &uni->orig, frame_base);
   }

   for (unsigned i = 0; i < GFX_MAX_SHADERS; i++)
   {
      snprintf(frame_base, sizeof(frame_base), "Pass%u", i + 1);
      clear_uniforms_frame(&uni->pass[i]);
      find_uniforms_frame(prog, &uni->pass[i], frame_base);
      if (i && pass > i + 1)
      {
         snprintf(frame_base, sizeof(frame_base), "PassPrev%u", pass - i);
         find_uniforms_frame(prog, &uni->pass[i], frame_base);
      }
   }

   clear_uniforms_frame(&uni->prev[0]);
   find_uniforms_frame(prog, &uni->prev[0], "Prev");
   for (unsigned i = 1; i < PREV_TEXTURES; i++)
   {
      snprintf(frame_base, sizeof(frame_base), "Prev%u", i);
      clear_uniforms_frame(&uni->prev[i]);
      find_uniforms_frame(prog, &uni->prev[i], frame_base);
   }

   glUseProgram(0);
}