0% found this document useful (0 votes)
88 views5 pages

OpenGL Shader Code for Fog and Water Effects

This document contains shader code that handles multi-version rendering and centroid sampling. It defines variables for position, color, texture coordinates and other attributes. Based on preprocessor directives, it handles rendering with or without fog, water, blending effects. It computes wave animations, fog color and depth based on time, position and fog settings.

Uploaded by

Lautaro Gonzalez
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
88 views5 pages

OpenGL Shader Code for Fog and Water Effects

This document contains shader code that handles multi-version rendering and centroid sampling. It defines variables for position, color, texture coordinates and other attributes. Based on preprocessor directives, it handles rendering with or without fog, water, blending effects. It computes wave animations, fog color and depth based on time, position and fog settings.

Uploaded by

Lautaro Gonzalez
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd

// __multiversion__

// This signals the loading code to prepend either #version 100 or #version 300 es
as apropriate.

// To use centroid sampling we need to have version 300 es shaders, which requires
changing:
// attribute to in
// varying to out when in vertex shaders or in when in fragment shaders
// defining an out vec4 FragColor and replacing uses of gl_FragColor with FragColor
// texture2D to texture
#if __VERSION__ >= 300
#define attribute in
#define varying out

#ifdef MSAA_FRAMEBUFFER_ENABLED
#define _centroid centroid
#else
#define _centroid
#endif

#ifndef BYPASS_PIXEL_SHADER
_centroid out vec2 uv0;
_centroid out vec2 uv1;
#endif
#else
#ifndef BYPASS_PIXEL_SHADER
varying vec2 uv0;
varying vec2 uv1;
#endif
#endif

#ifndef BYPASS_PIXEL_SHADER
varying vec4 color;
#endif

#ifdef FOG
varying vec4 fogColor;
#endif

#ifdef NEAR_WATER
varying float cameraDist;
#endif

varying float flag_waterplane;


varying float new_fog;

varying vec3 screen;

varying highp vec3 position;


varying highp vec3 look;

varying highp vec3 w_pos;

#ifdef AS_ENTITY_RENDERER
uniform MAT4 WORLDVIEWPROJ;
#else
uniform MAT4 WORLDVIEW;
uniform MAT4 PROJ;
#endif
uniform vec4 FOG_COLOR;
uniform vec2 FOG_CONTROL;
uniform float RENDER_DISTANCE;
uniform vec2 VIEWPORT_DIMENSION;
uniform vec4 CURRENT_COLOR;
uniform POS4 CHUNK_ORIGIN_AND_SCALE;
uniform POS3 VIEW_POS;
uniform float FAR_CHUNKS_DISTANCE;
uniform highp float TIME;
uniform int FOG_MODE;

attribute POS4 POSITION;


attribute vec4 COLOR;
attribute vec2 TEXCOORD_0;
attribute vec2 TEXCOORD_1;

bool getNetherMask(vec4 ambient){


if(ambient.r > ambient.b && ambient.r < 0.5 && ambient.b < 0.05){
return true;
} else {
return false;}
}

bool getTheEndMask(vec4 ambient){


if(ambient.r > ambient.g && ambient.b > ambient.g && ambient.r < 0.05 && ambient.b
< 0.05 && ambient.g < 0.05){
return true;
} else {
return false;}
}

bool getUnWaterMask(vec4 ambient){


if(ambient.b > ambient.r*2.5 && ambient.b*3.0 > ambient.g){
return true;
} else {
return false;}
}

void main()
{

#ifdef BYPASS_PIXEL_SHADER
gl_Position = vec4(0, 0, 0, 0);
return;
#else

POS4 worldPos;
#ifdef AS_ENTITY_RENDERER
POS4 pos = WORLDVIEWPROJ * POSITION;
worldPos = pos;
#else
worldPos.xyz = (POSITION.xyz * CHUNK_ORIGIN_AND_SCALE.w) +
CHUNK_ORIGIN_AND_SCALE.xyz;
worldPos.w = 1.0;

position = worldPos.xyz + VIEW_POS.xyz;


look = worldPos.xyz;

float fractposy = fract(position.y);


if(fractposy < 0.1 && fractposy >= 0.0){
flag_waterplane = 1.0;
}
else{
flag_waterplane = 0.0;
}

POS4 pos = WORLDVIEW * worldPos;


pos = PROJ * pos;

#endif
screen.st = pos.st / (pos.z + 0.8);
gl_Position = pos;

float debugfog = 0.0;


POS3 pp = worldPos.xyz + VIEW_POS.xyz;

uv0 = TEXCOORD_0;
uv1 = TEXCOORD_1;
color = COLOR;

float wav1 = sin(TIME * 4.0 + pp.x+pp.z+pp.x+pp.z+pp.y) * sin(pp.z) * 0.015;

float wav2 = 0.06*sin(6.0*(TIME*0.2+pp.x/0.25+pp.z/1.0))


+0.09*sin(6.0*(TIME*0.3+pp.x/5.0-pp.z/2.0))+0.09*sin(6.0*(TIME*0.2-pp.x/7.0+pp.z/
4.0));

#ifdef ALPHA_TEST
if(color.g + color.g > color.r + color.b){
gl_Position += wav1;
}
#endif
vec3 wave = worldPos.xyz + VIEW_POS;
#ifdef ALPHA_TEST
if(color.g > color.b)
{
gl_Position.y += sin(color.r + TIME * 2. + wave.z * wave.x) * .08;
}
#endif

#ifdef BLEND
if(color.b > color.r && position.y < 0.5)
{

gl_Position.y += cos(TIME * 0.5 - wave.x + wave.y) * 0.15;


gl_Position.x += cos(TIME * 0.5 + wave.x * wave.y + wave.z) * 0.08;

}
#endif
if((FOG_CONTROL.x < 0.02))
{

gl_Position.x += cos(TIME * 0.2 + wave.y * wave.z * wave.x) * 0.1;

if((FOG_CONTROL.x < 0.02))


{

gl_Position.y += cos(TIME * 0.2 + wave.y * wave.z * wave.x) * 0.1;

#if defined(FOG) || defined(NEAR_WATER)


#ifdef FANCY
vec3 relPos = -worldPos.xyz;
float cameraDepth = length(relPos);
#ifdef NEAR_WATER
cameraDist = cameraDepth / FAR_CHUNKS_DISTANCE;
#endif
#else
float cameraDepth = pos.z;
#ifdef NEAR_WATER
vec3 relPos = -worldPos.xyz;
float camDist = length(relPos);
cameraDist = camDist / FAR_CHUNKS_DISTANCE;
#endif
#endif
#endif

#ifdef FOG
float len = cameraDepth / RENDER_DISTANCE;

#ifdef ALLOW_FADE
len += CURRENT_COLOR.r;
#endif

fogColor.rgb = FOG_COLOR.rgb;
fogColor.a = clamp((len - FOG_CONTROL.x) / (FOG_CONTROL.y - FOG_CONTROL.x), 0.0,
1.0);

if(getNetherMask(FOG_COLOR)){
fogColor.a = clamp((len - FOG_CONTROL.x*0.5), 0.0,1.0);
fogColor.rgb += vec3(0.2)*1.5;
debugfog = 1.0;
}

if(getUnWaterMask(FOG_COLOR)){
if(debugfog==1.0){
fogColor.a = clamp((len - FOG_CONTROL.x), 0.0,0.6);
fogColor.rgb /= FOG_COLOR.rgb;
fogColor.rgb *= vec3(0.8, 0.8, 1.0);
}
if(uv1.y<0.8749){
color.rgb+=(vec3(wav2)*2.0)*uv1.y;
gl_Position.y += wav1;
}}
#endif

vec3 rel = -worldPos.xyz*0.5;


float addfog = length(rel);
float RD = 0.2;
if(getTheEndMask(FOG_COLOR)){RD = 0.5, 0.5, 0.5;}
new_fog = addfog / FAR_CHUNKS_DISTANCE*RD;

#endif
}

You might also like