123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- #version 120
- varying vec3 VNormal;
- varying vec3 vViewVec;
- varying vec3 reflVec;
- uniform float osg_SimulationTime;
- uniform sampler2D BaseTex;
- uniform sampler2D DirtTex;
- uniform sampler2D Scanlines;
- uniform samplerCube Environment;
- uniform int display_enabled;
- uniform float frame_factor;
- uniform float test_value;
- uniform float distortion;
- uniform float flicker_factor;
- uniform float view_y;
- float SCANTHICK = 2.0;
- float INTENSITY = 0.15;
- float BRIGHTBOOST = 0.15;
- //float DISTORTION = 0.03;
- float THRESHOLD = 0.05;
- vec2 TextureSize = vec2(800, 950);
- vec4 bloomTexture2D(sampler2D texture, vec2 texCoords)
- {
- vec4 texel = vec4(0, 0, 0, 0);
- float blur = 0.4;
- int size = 3;
- for(int x = -size; x <= size; x++)
- {
- for(int y = -size; y <= size; y++)
- {
- texel += texture2D(texture, texCoords + vec2(x/TextureSize.x, y/TextureSize.y));
- }
- }
- return (blur*texel/pow((2*size)+1, 2) + (1.0-blur)*texture2D(texture, texCoords));
- }
- vec2 distort(vec2 position)
- {
- position = vec2(2.0 * position - 1.0);
- position = position /(1.0 - distortion * length(position));
- position =(position + 1.0) * 0.5;
- return position;
- }
- vec3 frame(vec2 position, vec3 color)
- {
- // intersection between two ellipses and four circles
- position -= vec2(0.5);
- position *= vec2(2.0);
- float x2 = position.x * position.x;
- float y2 = position.y * position.y;
- if((x2/frame_factor) +(y2/20) > 1 || (x2/40) +(y2/frame_factor+0.03) > 1) {
- color = vec3(0.0, 0.0, 0.0);
- }
- // && length(abs(position)-vec2(frame_factor-0.08, frame_factor-0.06)) > 0.1
- float val = 0.6293*frame_factor + 0.2869;
- if( length(position) > frame_factor + 0.4 && length(abs(position)-vec2(val,val)) > 0.1 ) {
- color = vec3(0.0, 0.0, 0.0);
- }
- return color;
- }
- vec3 scanline(vec3 texel)
- {
- vec3 scanlines = texture2D(Scanlines, vec2(150, 300)*gl_TexCoord[0].xy).rgb;
- texel *= 1.5*scanlines;
- return texel;
- }
- vec3 backlight(vec3 color)
- {
- if(color.r < THRESHOLD && color.g < THRESHOLD && color.b < THRESHOLD) {
- color = vec3(THRESHOLD, THRESHOLD, THRESHOLD);
- }
- return color;
- }
- vec3 flickering(vec2 position, vec3 texel)
- {
- texel *= 0.95+flicker_factor*(1-mod(5*osg_SimulationTime+position.y, 1.0));
- return texel;
- }
- vec3 reflection()
- {
- vec3 coords;
- coords.x = reflVec.x; // distance
- coords.y = 1.5*reflVec.y + 0.5*view_y;
- coords.z = 1.5*reflVec.z - 0.25;
- vec3 reflection = 0.1*textureCube(Environment, coords).rgb;
- float NdotL;
- vec3 n = normalize(VNormal);
- vec3 lightDir = gl_LightSource[0].position.xyz;
- NdotL = max(dot(n, lightDir), 0.0);
- return NdotL*reflection;
- }
- void main()
- {
- vec3 texel = vec3(0.0, 0.0, 0.0);
- vec3 dirt = 0.1*texture2D(DirtTex, gl_TexCoord[0].xy).rgb;
- // crt-effect
- if(display_enabled > 0) {
- vec2 position = distort(gl_TexCoord[0].xy);
- if(position.x > 0.0 && position.y > 0.0 && position.x < 1.0 && position.y < 1.0) {
- // texel = texture2D(BaseTex, position).rgb;
- texel = bloomTexture2D(BaseTex, position).rgb;
- texel = backlight(texel);
- texel = scanline(texel);
- texel = flickering(position, texel);
- }
- texel = frame(position, texel);
- }
- texel += dirt;
- texel += reflection();
- texel = clamp(texel, 0.0, 1.0);
- gl_FragColor = vec4(texel, 1.0);
- }
|