uniform sampler2D m_Alpha; uniform sampler2D m_Tex1; uniform sampler2D m_Tex2; uniform sampler2D m_Tex3; uniform float m_Tex1Scale; uniform float m_Tex2Scale; uniform float m_Tex3Scale; varying vec2 texCoord; #ifdef TRI_PLANAR_MAPPING varying vec4 vVertex; varying vec3 vNormal; #endif void main(void) { // get the alpha value at this 2D texture coord vec4 alpha = texture2D( m_Alpha, texCoord.xy ); #ifdef TRI_PLANAR_MAPPING // tri-planar texture bending factor for this fragment's normal vec3 blending = abs( vNormal ); blending = (blending -0.2) * 0.7; blending = normalize(max(blending, 0.00001)); // Force weights to sum to 1.0 (very important!) float b = (blending.x + blending.y + blending.z); blending /= vec3(b, b, b); // texture coords vec4 coords = vVertex; vec4 col1 = texture2D( m_Tex1, coords.yz * m_Tex1Scale ); vec4 col2 = texture2D( m_Tex1, coords.xz * m_Tex1Scale ); vec4 col3 = texture2D( m_Tex1, coords.xy * m_Tex1Scale ); // blend the results of the 3 planar projections. vec4 tex1 = col1 * blending.x + col2 * blending.y + col3 * blending.z; col1 = texture2D( m_Tex2, coords.yz * m_Tex2Scale ); col2 = texture2D( m_Tex2, coords.xz * m_Tex2Scale ); col3 = texture2D( m_Tex2, coords.xy * m_Tex2Scale ); // blend the results of the 3 planar projections. vec4 tex2 = col1 * blending.x + col2 * blending.y + col3 * blending.z; col1 = texture2D( m_Tex3, coords.yz * m_Tex3Scale ); col2 = texture2D( m_Tex3, coords.xz * m_Tex3Scale ); col3 = texture2D( m_Tex3, coords.xy * m_Tex3Scale ); // blend the results of the 3 planar projections. vec4 tex3 = col1 * blending.x + col2 * blending.y + col3 * blending.z; #else vec4 tex1 = texture2D( m_Tex1, texCoord.xy * m_Tex1Scale ); // Tile vec4 tex2 = texture2D( m_Tex2, texCoord.xy * m_Tex2Scale ); // Tile vec4 tex3 = texture2D( m_Tex3, texCoord.xy * m_Tex3Scale ); // Tile #endif vec4 outColor = tex1 * alpha.r; // Red channel outColor = mix( outColor, tex2, alpha.g ); // Green channel outColor = mix( outColor, tex3, alpha.b ); // Blue channel gl_FragColor = outColor; }