//-------------------------------------------------------------------------------------- // 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; }
//-------------------------------------------------------------------------------------- // 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; }