Esempio n. 1
0
static inline Eina_Bool
_program_build(E3D_Program *program, const char *vert_src, const char *frag_src)
{
   GLint ok;

   /* Create OpenGL vertex & fragment shader object. */
   program->vert = glCreateShader(GL_VERTEX_SHADER);
   program->frag = glCreateShader(GL_FRAGMENT_SHADER);

   /* Commpile vertex shader. */
   if (!_shader_compile(program->vert, vert_src))
     {
        ERR("Faield to compile vertex shader.");
        return EINA_FALSE;
     }

   /* Compile fragment shader. */
   if (!_shader_compile(program->frag, frag_src))
     {
        ERR("Failed to compile fragment shader.");
        return EINA_FALSE;
     }

   /* Create OpenGL program object. */
   program->prog = glCreateProgram();

   /* Attach shaders. */
   glAttachShader(program->prog, program->vert);
   glAttachShader(program->prog, program->frag);

   /* Link program. */
   glLinkProgram(program->prog);

   /* Check link status. */
   glGetProgramiv(program->prog, GL_LINK_STATUS, &ok);

   if (!ok)
     {
        GLchar   *log_str;
        GLint     len;
        GLsizei   info_len;

        glGetProgramiv(program->prog, GL_INFO_LOG_LENGTH, &len);
        log_str = (GLchar *)malloc(len);
        glGetProgramInfoLog(program->prog, len, &info_len, log_str);
        ERR("Shader link failed.\n%s", log_str);
        free(log_str);
        return EINA_FALSE;
     }

   return EINA_TRUE;
}
Esempio n. 2
0
Shader_t *shader_load(const char *aVertSrc, const char *aFragSrc)
{
    Shader_t *out = obj_create_autoreleased(&Class_Shader);
    out->activationCallback = NULL;
    out->deactivationCallback = NULL;
    for(int i = 0; i < kShader_MaxUniforms; ++i) out->uniforms[i] = -1;
    for(int i = 0; i < kShader_MaxAttributes; ++i) out->attributes[i] = -1;
    out->program = glCreateProgram();

    bool success;

    GLuint vertexShader = _shader_compile(aVertSrc, GL_VERTEX_SHADER, &success);
    dynamo_assert(success, "Couldn't compile vertex shader");

    GLuint fragmentShader = _shader_compile(aFragSrc, GL_FRAGMENT_SHADER, &success);
    dynamo_assert(success, "Couldn't compile fragment shader");

    glAttachShader(out->program, vertexShader);
    out->vertexShader = vertexShader;
    glAttachShader(out->program, fragmentShader);
    out->fragmentShader = fragmentShader;

    success = _shader_link(out->program);
    glError()
    dynamo_assert(success, "Couldn't link shader program");

    // Hook up the default uniforms&attributes if available
    out->uniforms[kShader_worldMatrixUniform] = shader_getUniformLocation(out, kShader_UniformNames[kShader_worldMatrixUniform]);
    out->uniforms[kShader_projectionMatrixUniform] = shader_getUniformLocation(out, kShader_UniformNames[kShader_projectionMatrixUniform]);
    out->uniforms[kShader_colormap0Uniform] = shader_getUniformLocation(out, kShader_UniformNames[kShader_colormap0Uniform]);

    out->attributes[kShader_positionAttribute] = shader_getAttributeLocation(out, kShader_AttributeNames[kShader_positionAttribute]);
    out->attributes[kShader_texCoord0Attribute] = shader_getAttributeLocation(out, kShader_AttributeNames[kShader_texCoord0Attribute]);

    return out;
}