Newer
Older
GHFX_REFACTOR / bin / x86 / Debug / GeoScene / Globe / Temp / OceanResource / particle.glsl
wxn on 2 Nov 2016 2 KB 提交
#ifdef OPENGL32
in vec3 initialPosition;
in vec3 initialVelocity;
in float size;
in float startTime;
in float offsetX;
in float offsetY;
in float texCoordX;
in float texCoordY;
out float elapsed;
out vec2 texCoord;
out vec3 vEye;
out vec3 vWorld;
#else
attribute vec3 initialPosition;
attribute vec3 initialVelocity;
attribute float size;
attribute float startTime;
attribute float offsetX;
attribute float offsetY;
attribute float texCoordX;
attribute float texCoordY;
varying float elapsed;
varying vec2 texCoord;
varying vec3 vEye;
varying vec3 vWorld;
#endif

uniform mat4 mvProj;
uniform mat4 modelView;
uniform float time;
uniform vec3 g;
uniform vec3 cameraPos;
uniform vec3 refOffset;

uniform bool hasHeightMap;
uniform mat4 heightMapMatrix;
uniform sampler2D heightMap;
uniform float invSizeFactor;
uniform sampler2D alphaMap;

void main()
{
    elapsed = time - startTime;

    // p(t) = p0 + v0t + 0.5gt^2
    vec3 relPos = 0.5 * g * elapsed * elapsed + initialVelocity * elapsed + initialPosition;
    vec2 offset = vec2(offsetX, offsetY);

    vec3 worldPos = relPos + cameraPos - refOffset;

    float depthFade = 1.0;


	worldPos /= 6378137;
    float rho = sqrt(worldPos.x * worldPos.x + worldPos.y * worldPos.y + worldPos.z * worldPos.z);
	float longitude = atan(worldPos.x, worldPos.z);
	float latitude = asin(worldPos.y / rho);	
	float Pi = 3.1415926;
	vec2 alphaTexCoord;
    alphaTexCoord.x =  (longitude + Pi)/(2*Pi);
    alphaTexCoord.y = (latitude + Pi/2.0)/Pi;
    float alpha = texture2D(alphaMap, alphaTexCoord).a;
	
	if(alpha <0.1)
	{
	#ifdef POINT_SPRITES
            gl_PointSize = 0;
	#endif
            gl_Position = vec4(0.0,0.0,100.0,0.0);
            return;
	}
	

	
	
	
/*	
    if (hasHeightMap) {
#ifdef OPENGL32
        float height = texture(heightMap, (heightMapMatrix * vec4(worldPos, 1.0)).xy).x;
#else
        float height = texture2D(heightMap, (heightMapMatrix * vec4(worldPos, 1.0)).xy).x;
#endif

        if (height > -(size * invSizeFactor)) {
#ifdef POINT_SPRITES
            gl_PointSize = 0;
#endif
            gl_Position = vec4(0.0,0.0,100.0,0.0);
            return;
        }
    }
*/


    vec4 wPos = vec4(relPos - refOffset, 1.0);

    vec4 eyeSpacePos = modelView * wPos;

#ifdef POINT_SPRITES
    float dist = length(eyeSpacePos.xyz);
    gl_PointSize = max(1.0, size / dist);
#endif

    eyeSpacePos.xy += offset;

    wPos = eyeSpacePos * modelView;

    texCoord = vec2(texCoordX, texCoordY);

    gl_Position = mvProj * wPos;

    vEye = eyeSpacePos.xyz / eyeSpacePos.w;
    vWorld = worldPos;
	
	

	
}