/*
================================================================================================
idRenderProgManager::LoadVertexShader
================================================================================================
*/
void idRenderProgManager::LoadVertexShader( int index )
{
	if( vertexShaders[index].progId != INVALID_PROGID )
	{
		return; // Already loaded
	}
	
	vertexShader_t& vs = vertexShaders[index];
	vertexShaders[index].progId = ( GLuint ) LoadGLSLShader( GL_VERTEX_SHADER, vs.name, vs.nameOutSuffix, vs.shaderFeatures, vs.builtin, vs.uniforms );
}
/*
================================================================================================
idRenderProgManager::LoadFragmentShader
================================================================================================
*/
void idRenderProgManager::LoadFragmentShader( int index )
{
	if( fragmentShaders[index].progId != INVALID_PROGID )
	{
		return; // Already loaded
	}
	
	fragmentShader_t& fs = fragmentShaders[index];
	fragmentShaders[index].progId = ( GLuint ) LoadGLSLShader( GL_FRAGMENT_SHADER, fs.name, fs.nameOutSuffix, fs.shaderFeatures, fs.builtin, fs.uniforms );
}
Example #3
0
//
// LoadShaders
//
bool LoadShaders()
{
    puts("Load shaders");
    GLuint vsh, fsh;
    bool bLinked;

    //
    // Transform'n'Color program
    //
    vsh = LoadGLSLShader(GL_VERTEX_SHADER, g_pVshTransform);
    fsh = LoadGLSLShader(GL_FRAGMENT_SHADER, g_pFshFill);
    if ((0 == vsh) || (0 == fsh))
        return false;
    g_WvpAndColorProgram = glCreateProgram();
    glAttachShader(g_WvpAndColorProgram, vsh);
    glAttachShader(g_WvpAndColorProgram, fsh);
    glBindAttribLocation(g_WvpAndColorProgram, 0, "position");
    bLinked = LinkGLSLProgram(g_WvpAndColorProgram);
    glDeleteShader(fsh);
    glDeleteShader(vsh);
    if (!bLinked)
    {
        glDeleteProgram(g_WvpAndColorProgram);
        return false;
    }

    g_WvpAndColorUniforms.Mwvp = GetUniformLocation(g_WvpAndColorProgram, "Mwvp");
    g_WvpAndColorUniforms.FillColor = GetUniformLocation(g_WvpAndColorProgram, "color");

    //
    // Phong lighting program
    //
    vsh = LoadGLSLShader(GL_VERTEX_SHADER, g_pVshPhong);
    fsh = LoadGLSLShaderFromFile(GL_FRAGMENT_SHADER, "phong.psh");
    if ((0 == vsh) || (0 == fsh))
        return false;
    g_PhongProgram = glCreateProgram();
    glAttachShader(g_PhongProgram, vsh);
    glAttachShader(g_PhongProgram, fsh);
    glBindAttribLocation(g_PhongProgram, 0, "position");
    glBindAttribLocation(g_PhongProgram, 1, "normal");
    bLinked = LinkGLSLProgram(g_PhongProgram);
    glDeleteShader(fsh);
    glDeleteShader(vsh);
    if (!bLinked)
    {
        glDeleteProgram(g_PhongProgram);
        return false;
    }

    g_PhongUniforms.Mpivot = GetUniformLocation(g_PhongProgram, "Mpivot");
    g_PhongUniforms.Mworld = GetUniformLocation(g_PhongProgram, "Mworld");
    g_PhongUniforms.Mwvp = GetUniformLocation(g_PhongProgram, "Mwvp");
    
    for (int i = 0; i < MAX_POINT_LIGHTS; ++i)
    {
        char name[256];

        sprintf(name, "light_and_radius[%d]", i);
        g_PhongUniforms.Light[i] = GetUniformLocation(g_PhongProgram, name);
        sprintf(name, "Kd[%d]", i);
        g_PhongUniforms.Kd[i] = GetUniformLocation(g_PhongProgram, name);
        sprintf(name, "Ks[%d]", i);
        g_PhongUniforms.Ks[i] = GetUniformLocation(g_PhongProgram, name);
    }

    g_PhongUniforms.Count = GetUniformLocation(g_PhongProgram, "count");
    g_PhongUniforms.ViewPos = GetUniformLocation(g_PhongProgram, "view");

    return true;
}