You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
63 lines
2.2 KiB
63 lines
2.2 KiB
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;
|
|
}
|
|
|
|
|