Hi All, my first post, and, well, I'm a complete noob to shaders. I'm learning how to use Ardor3D (java scenegraph), and am making a terrain engine for it. Currently I'm playing around with a skydome, and have placed a quad above the ground for clouds texturing. I found a cool cloud shader on the net, and have successfully applied it to my cloud quad. Now, for a nicer view, I need to alpha blend the quad in a circular fashion, so I can adjust things so where the quad intersects the skydome, I don't just get a harsh cutoff point of cloud texturing v skydome background.

I found a good tutorial online, that used the equation for a circle to apply a blend via the mix function from the texture colour to a given colour. So I thought I'd use this to adjust my quad shader to give me what I want. Anyway, it doesn't work and my lack of understanding to things doesn't allow me to troubleshoot yet, so I'm hoping someone could please have a look at it and see what I'm doing wrong.

Vertex Shader:

Code :uniform vec3 eyePosition; uniform vec3 sunDirection; uniform float scale; varying vec2 oUv; varying float oGlow; void main(void) { vec4 position = gl_Vertex; // get vertex-position gl_Position = gl_ModelViewProjectionMatrix * position; // get vertex-normal vec3 normal = gl_Normal; oGlow = pow (clamp (dot ((position.xyz - eyePosition), sunDirection), 0.0, 1.0), 7.0); // UV-coordiantes oUv = vec2 (gl_MultiTexCoord0.xy) * scale; gl_TexCoord[0] = gl_MultiTexCoord0; }

Fragment Shader:

Code :uniform sampler2D cloud; uniform sampler2D detail; uniform vec3 sunDirection; uniform float time; uniform vec4 fogColor; uniform vec4 cloudColor; uniform float density; uniform float cloudInvScale; uniform float detailInvScale; uniform vec2 cloudSpeed; uniform vec2 detailSpeed; uniform float circleRadius; uniform vec2 textureSize; uniform float tolerance; varying vec2 oUv; varying float oGlow; void main(void) { vec2 cloudOffset = cloudSpeed * time; vec2 detailOffset = detailSpeed * time; vec2 circleRegionCoords = fract(gl_TexCoord[0].st); float a1 = texture2D (cloud, (oUv + cloudOffset) * cloudInvScale).b; float a2 = texture2D (detail,(oUv + detailOffset) * detailInvScale).b; //float a3 = texture2D (mask, gl_TexCoord[0].st).a; vec3 p_sunDirection = normalize (sunDirection) * -0.01; p_sunDirection.x = p_sunDirection.x; p_sunDirection.y = -p_sunDirection.z; p_sunDirection.z = 0.0; vec4 p_fogColor = fogColor; vec4 oCol = cloudColor * (p_fogColor *2.0); oCol.a *= clamp (a1 + a2 - 1.0, 0.0, 1.0); oCol.rgb *= 1 - oCol.a * density; vec3 absorption = vec3(0.0); absorption += clamp ( texture2D (cloud, (oUv + sunDirection.xy * 0.2 + cloudOffset) * cloudInvScale).rgb + texture2D (detail, (oUv + sunDirection.xy * 0.2 + detailOffset) * detailInvScale).rgb - 1.0, 0.0, 1.0); absorption += clamp ( texture2D (cloud, (oUv + sunDirection.xy * 0.4 + cloudOffset) * cloudInvScale).rgb + texture2D (detail, (oUv + sunDirection.xy * 0.4 + detailOffset) * detailInvScale).rgb - 1.0, 0.0, 1.0); absorption += clamp ( texture2D (cloud, (oUv + sunDirection.xy * 0.6 + cloudOffset) * cloudInvScale).rgb + texture2D (detail, (oUv + sunDirection.xy * 0.6 + detailOffset) * detailInvScale).rgb - 1.0, 0.0, 1.0); absorption += clamp ( texture2D (cloud, (oUv + sunDirection.xy * 0.8 + cloudOffset) * cloudInvScale).rgb + texture2D (detail, (oUv + sunDirection.xy * 0.8 + detailOffset) * detailInvScale).rgb - 1.0, 0.0, 1.0); absorption += clamp ( texture2D (cloud, (oUv + sunDirection.xy * 1.0 + cloudOffset) * cloudInvScale).rgb + texture2D (detail, (oUv + sunDirection.xy * 1.0 + detailOffset) * detailInvScale).rgb - 1.0, 0.0, 1.0); oCol.rgb *= 1.0 - clamp (absorption * 0.2, 0.0, 1.0) * density; oCol.rgb *= oGlow; //blend between fragments in the circle and out of the circle defining our "pixel region" //Equation of a circle: (x - h)^2 + (y - k)^2 = r^2 vec2 powers = pow(abs(circleRegionCoords - (textureSize/2)),vec2(2.0)); float radiusSqrd = pow(circleRadius,2.0); float gradient = smoothstep(radiusSqrd-tolerance, radiusSqrd+tolerance, powers.x+powers.y); gl_FragColor = mix(oCol, vec4(0.0,0.0,0.0,0.0), gradient); }

If someone could point me in the right direction, or maybe even test it I'd be really grateful, I intend to learn more about this stuff, it seems the way forward for fast effects.