Beispiel #1
0
void Shader::Link(const char *name)
{
    glLinkProgram(program);
    GLint status;
    glGetProgramiv(program, GL_LINK_STATUS, &status);
    if (status != GL_TRUE)
    {
        GLSLError(program, true, nullptr);
        throw string("linking failed for shader: ") + name;
    }

    mvp_i          = glGetUniformLocation(program, "mvp");
    col_i          = glGetUniformLocation(program, "col");
    camera_i       = glGetUniformLocation(program, "camera");
    light1_i       = glGetUniformLocation(program, "light1");
    lightparams1_i = glGetUniformLocation(program, "lightparams1");
    bones_i        = glGetUniformLocation(program, "bones");
    pointscale_i   = glGetUniformLocation(program, "pointscale");

    glUseProgram(program);

    for (int i = 0; i < MAX_SAMPLERS; i++)
    {
        tex_i[i] = glGetUniformLocation(program, ("tex" + to_string(i)).c_str());
        if (tex_i[i] >= 0) glUniform1i(tex_i[i], i);
    }
}
Beispiel #2
0
uint CompileGLSLShader(GLenum type, uint program, const GLchar *source, string &err) 
{
    uint obj = glCreateShader(type);
    glShaderSource(obj, 1, &source, NULL);
    glCompileShader(obj);
    GLint success;
    glGetShaderiv(obj, GL_COMPILE_STATUS, &success);
    if (success)
    {
        glAttachShader(program, obj);
        return obj; 
    }
    err = GLSLError(obj, false, source);
    glDeleteShader(obj);
    return 0;
}
Beispiel #3
0
string Shader::Compile(const char *name, const char *vscode, const char *pscode)
{
    program = glCreateProgram();

    string err;
    vs = CompileGLSLShader(GL_VERTEX_SHADER,   program, vscode, err); if (!vs) return string("couldn't compile vertex shader: ") + name + "\n" + err;
    ps = CompileGLSLShader(GL_FRAGMENT_SHADER, program, pscode, err); if (!ps) return string("couldn't compile pixel shader: ") + name + "\n" + err;

    glBindAttribLocation(program, 0, "apos");
    glBindAttribLocation(program, 1, "anormal");
    glBindAttribLocation(program, 2, "atc");
    glBindAttribLocation(program, 3, "acolor");
    glBindAttribLocation(program, 4, "aweights");
    glBindAttribLocation(program, 5, "aindices");

    glLinkProgram(program);
    GLint status;
    glGetProgramiv(program, GL_LINK_STATUS, &status);
    if (status != GL_TRUE)
    {
        GLSLError(program, true, NULL);
        throw string("linking failed for shader: ") + name;
    }

    mvp_i    = glGetUniformLocation(program, "mvp");
    col_i    = glGetUniformLocation(program, "col");
    camera_i = glGetUniformLocation(program, "camera");
    light1_i = glGetUniformLocation(program, "light1");
    bones_i  = glGetUniformLocation(program, "bones");

    glUseProgram(program);

    for (int i = 0; i < MAX_SAMPLERS; i++)
    {
        tex_i[i] = glGetUniformLocation(program, (string("tex") + inttoa(i)).c_str());
        if (tex_i[i] >= 0) glUniform1i(tex_i[i], i); 
    }

    return "";
}