//--------------------------------------------------------------------------------------
// Name: FrmCompileShaderProgramFromFile()
// Desc: 
//--------------------------------------------------------------------------------------
bool FrmCompileShaderProgramFromFile( const char* strVertexShaderFileName,
                                      const char* strFragmentShaderFileName, 
                                      GLuint* pShaderProgramHandle,
                                      const FRM_SHADER_ATTRIBUTE* pAttributes,
                                      UINT32 nNumAttributes )
{
    // Create the object handles
    GLuint hVertexShader   = glCreateShader( GL_VERTEX_SHADER );
    GLuint hFragmentShader = glCreateShader( GL_FRAGMENT_SHADER );

    // Compile the shaders
    if( !FrmLoadShaderObjectFromFile( strVertexShaderFileName, hVertexShader ) )
    {
        glDeleteShader( hVertexShader );
        glDeleteShader( hFragmentShader );
        return FALSE;
    }
    if( !FrmLoadShaderObjectFromFile( strFragmentShaderFileName, hFragmentShader ) )
    {
        glDeleteShader( hVertexShader );
        glDeleteShader( hFragmentShader );
        return FALSE;
    }


    // Attach the individual shaders to the common shader program
    GLuint hShaderProgram = glCreateProgram();
    glAttachShader( hShaderProgram, hVertexShader );
    glAttachShader( hShaderProgram, hFragmentShader );

    // Bind the attributes to the shader program
    FrmBindShaderAttributes( hShaderProgram, pAttributes, nNumAttributes );

    // Link the vertex shader and fragment shader together
    if( FALSE == FrmLinkShaderProgram( hShaderProgram ) )
    {
        glDeleteProgram( hShaderProgram );
        return FALSE;
    }

    // It's now safe to toss away the original shader handles
    glDeleteShader( hVertexShader );
    glDeleteShader( hFragmentShader );

    // Return the shader program
    (*pShaderProgramHandle) = hShaderProgram;
    return TRUE;
}
Example #2
0
//--------------------------------------------------------------------------------------
// Name: InitShaders()
// Desc: Initialize the shaders
//--------------------------------------------------------------------------------------
BOOL CSample::InitShaders()
{
    // Create the point sprite shader
    {
        // Create the vertex layout for the particles
        FRM_VERTEX_ELEMENT VertexLayout[] = 
        {
            { 0, 3, GL_FLOAT,         FALSE, 3*sizeof(FLOAT32) }, // m_vPosition
            { 1, 3, GL_FLOAT,         FALSE, 3*sizeof(FLOAT32) }, // m_vVelocity
            { 2, 4, GL_FLOAT,		  FALSE, 4*sizeof(FLOAT32) }, // m_vColor
            { 3, 1, GL_FLOAT,         FALSE, 1*sizeof(FLOAT32) }, // m_fStartTime
            { 4, 1, GL_FLOAT,         FALSE, 1*sizeof(FLOAT32) }, // m_fLifeSpan
            { 5, 1, GL_FLOAT,         FALSE, 1*sizeof(FLOAT32) }, // m_fInitialSize
            { 6, 1, GL_FLOAT,         FALSE, 1*sizeof(FLOAT32) }, // m_fFinalSize
            NULL
        };
        FrmMemcpy( m_ParticleVertexLayout, VertexLayout, sizeof(VertexLayout) );

        FRM_SHADER_ATTRIBUTE pShaderAttributes[] = 
        {
            { "g_vPosition",         0 },
            { "g_vVelocity",         1 },
            { "g_vColor",            2 },
            { "g_fStartTime",        3 },
            { "g_fLifeSpan",         4 },
            { "g_fInitialSize",      5 },
            { "g_fSizeIncreaseRate", 6 },
        };
        const INT32 nNumShaderAttributes = sizeof(pShaderAttributes)/sizeof(pShaderAttributes[0]);

        if( FALSE == FrmCompileShaderProgramFromFile( "Samples/Shaders/PointSprites30.vs",
                                                      "Samples/Shaders/PointSprites30.fs",
                                                      &m_hParticleShader,
                                                      pShaderAttributes, nNumShaderAttributes ) )
            return FALSE;

        // Make a record of the location for each shader constant
        m_slotModelViewProjMatrix = glGetUniformLocation( m_hParticleShader,  "g_matModelViewProj" );
        m_slotTime                = glGetUniformLocation( m_hParticleShader,  "g_fTime" );
    }


	{
		FRM_SHADER_ATTRIBUTE pShaderAttributes[] = 
        {
            { "g_vPosition",         0 },
            { "g_vVelocity",         1 },
            { "g_vColor",            2 },
            { "g_fStartTime",        3 },
            { "g_fLifeSpan",         4 },
            { "g_fInitialSize",      5 },
            { "g_fSizeIncreaseRate", 6 },
        };

		const INT32 nNumShaderAttributes = sizeof(pShaderAttributes)/sizeof(pShaderAttributes[0]);

		const char* varyings[7] = {
			"o_vPosition",
			"o_vVelocity",
			"o_vColor",
			"o_fStartTime",
			"o_fLifeSpan",
			"o_fInitialSize",
			"o_fSizeIncreaseRate"
		};

		m_emitParticleShader.ShaderID = glCreateProgram();
		GLuint hVertexShader  = glCreateShader( GL_VERTEX_SHADER );
		GLuint hFragmentShader  = glCreateShader( GL_FRAGMENT_SHADER );
		
		if( FALSE == FrmLoadShaderObjectFromFile( "Samples/Shaders/EmitParticles30.vs", hVertexShader ) )
			return FALSE;
		if( FALSE == FrmLoadShaderObjectFromFile( "Samples/Shaders/EmitParticles30.fs", hFragmentShader ) )
			return FALSE;
		glAttachShader( m_emitParticleShader.ShaderID, hVertexShader );
		glAttachShader( m_emitParticleShader.ShaderID, hFragmentShader );

		// Bind the attributes to the shader program
		FrmBindShaderAttributes( m_emitParticleShader.ShaderID, &pShaderAttributes[0], nNumShaderAttributes );

		// setup transform feedback varyings
		glTransformFeedbackVaryings( m_emitParticleShader.ShaderID, 7, varyings, GL_INTERLEAVED_ATTRIBS );

		// finally, link the program
		if( FALSE == FrmLinkShaderProgram( m_emitParticleShader.ShaderID ) )
			return FALSE;

		// get the uniform locations
		m_emitParticleShader.slotvPosition				= glGetUniformLocation( m_emitParticleShader.ShaderID, "u_vPosition" );
		m_emitParticleShader.slotvVelocity				= glGetUniformLocation( m_emitParticleShader.ShaderID, "u_vVelocity" );
		m_emitParticleShader.slotfEmitterSpread			= glGetUniformLocation( m_emitParticleShader.ShaderID, "u_fEmitterSpread" );
		m_emitParticleShader.slotfEmitterRadius			= glGetUniformLocation( m_emitParticleShader.ShaderID, "u_fEmitterRadius" );
		m_emitParticleShader.slotfSpeedVariance			= glGetUniformLocation( m_emitParticleShader.ShaderID, "u_fSpeedVariance" );
		m_emitParticleShader.slotfInitialOpacity		= glGetUniformLocation( m_emitParticleShader.ShaderID, "u_fInitialOpacity" );
		m_emitParticleShader.slotfOpacityVariance		= glGetUniformLocation( m_emitParticleShader.ShaderID, "u_fOpacityVariance" );
		m_emitParticleShader.slotfInitialLifeSpan		= glGetUniformLocation( m_emitParticleShader.ShaderID, "u_fInitialLifeSpan" );
		m_emitParticleShader.slotfLifeSpanVariance		= glGetUniformLocation( m_emitParticleShader.ShaderID, "u_fLifeSpanVariance" );
		m_emitParticleShader.slotfInitialSize			= glGetUniformLocation( m_emitParticleShader.ShaderID, "u_fInitialSize" );
		m_emitParticleShader.slotfInitialSizeVariance	= glGetUniformLocation( m_emitParticleShader.ShaderID, "u_fInitialSizeVariance" );
		m_emitParticleShader.slotfSizeIncreaseRate		= glGetUniformLocation( m_emitParticleShader.ShaderID, "u_fSizeIncreaseRate" );
		m_emitParticleShader.slotfSizeIncreaseRateVariance= glGetUniformLocation( m_emitParticleShader.ShaderID, "u_fSizeIncreaseRateVariance" );
		m_emitParticleShader.slotfTime					= glGetUniformLocation( m_emitParticleShader.ShaderID, "u_fTime" );
		m_emitParticleShader.slotvColor					= glGetUniformLocation( m_emitParticleShader.ShaderID, "u_vColor" );
		m_emitParticleShader.slotfEmissionRate			= glGetUniformLocation( m_emitParticleShader.ShaderID, "u_fEmissionRate" );
	}

    return TRUE;
}