159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartauniform sampler2D m_Alpha;
259b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartauniform sampler2D m_Tex1;
359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartauniform sampler2D m_Tex2;
459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartauniform sampler2D m_Tex3;
559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartauniform float m_Tex1Scale;
659b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartauniform float m_Tex2Scale;
759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartauniform float m_Tex3Scale;
859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
959b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartavarying vec2 texCoord;
1059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
1159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta#ifdef TRI_PLANAR_MAPPING
1259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta  varying vec4 vVertex;
1359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta  varying vec3 vNormal;
1459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta#endif
1559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
1659b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartavoid main(void)
1759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta{
1859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
1959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    // get the alpha value at this 2D texture coord
2059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    vec4 alpha   = texture2D( m_Alpha, texCoord.xy );
2159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
2259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta#ifdef TRI_PLANAR_MAPPING
2359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    // tri-planar texture bending factor for this fragment's normal
2459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    vec3 blending = abs( vNormal );
2559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    blending = (blending -0.2) * 0.7;
2659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    blending = normalize(max(blending, 0.00001));      // Force weights to sum to 1.0 (very important!)
2759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    float b = (blending.x + blending.y + blending.z);
2859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    blending /= vec3(b, b, b);
2959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
3059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    // texture coords
3159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    vec4 coords = vVertex;
3259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
3359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    vec4 col1 = texture2D( m_Tex1, coords.yz * m_Tex1Scale );
3459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    vec4 col2 = texture2D( m_Tex1, coords.xz * m_Tex1Scale );
3559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    vec4 col3 = texture2D( m_Tex1, coords.xy * m_Tex1Scale );
3659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    // blend the results of the 3 planar projections.
3759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    vec4 tex1 = col1 * blending.x + col2 * blending.y + col3 * blending.z;
3859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
3959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    col1 = texture2D( m_Tex2, coords.yz * m_Tex2Scale );
4059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    col2 = texture2D( m_Tex2, coords.xz * m_Tex2Scale );
4159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    col3 = texture2D( m_Tex2, coords.xy * m_Tex2Scale );
4259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    // blend the results of the 3 planar projections.
4359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    vec4 tex2 = col1 * blending.x + col2 * blending.y + col3 * blending.z;
4459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
4559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    col1 = texture2D( m_Tex3, coords.yz * m_Tex3Scale );
4659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    col2 = texture2D( m_Tex3, coords.xz * m_Tex3Scale );
4759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    col3 = texture2D( m_Tex3, coords.xy * m_Tex3Scale );
4859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    // blend the results of the 3 planar projections.
4959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    vec4 tex3 = col1 * blending.x + col2 * blending.y + col3 * blending.z;
5059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
5159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta#else
5259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	vec4 tex1    = texture2D( m_Tex1, texCoord.xy * m_Tex1Scale ); // Tile
5359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	vec4 tex2    = texture2D( m_Tex2, texCoord.xy * m_Tex2Scale ); // Tile
5459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	vec4 tex3    = texture2D( m_Tex3, texCoord.xy * m_Tex3Scale ); // Tile
5559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	
5659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta#endif
5759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
5859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    vec4 outColor = tex1 * alpha.r; // Red channel
5959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	outColor = mix( outColor, tex2, alpha.g ); // Green channel
6059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	outColor = mix( outColor, tex3, alpha.b ); // Blue channel
6159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	gl_FragColor = outColor;
6259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta}
6359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
64