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